【问题标题】:What is the design pattern name that used to create an object by passing an engine object通过传递引擎对象来创建对象的设计模式名称是什么
【发布时间】:2015-10-07 13:48:26
【问题描述】:

我有一个名为DatabaseModel 的课程。

还有一个名为 DatabaseEngineInterface 的接口,其方法如下: 插入 更新 删除 选择

所以我可以在运行时确定使用哪个引擎 mysqloracle 是实现 DatabaseEngineInterface 的类

EngineDatabase engine = new MySQLEngine();
DatabaseModel db = new DatabaseModel(engine);

这种设计模式叫什么?

【问题讨论】:

    标签: database design-patterns


    【解决方案1】:

    具体来说,这是构造函数注入模式(在my book中描述),它是Strategy pattern的一个特例。

    【讨论】:

    • 是什么让它成为特例?
    • @faressoft 还有其他实现策略的方法;例如使用属性注入。
    • 这是否与依赖注入模式有关?
    • @faressoft 在我看来,没有像 依赖注入 (DI) 模式这样的东西。相反,存在各种 DI 模式。我在my book 中介绍了其中的一些。
    【解决方案2】:

    这不是strategy pattern 的实现吗?维基百科指出策略模式是:

    >a software design pattern that enables an algorithm's behavior to be selected at runtime
    

    它还说策略模式:

    • 定义了一系列算法,
    • 封装了每个算法,并且
    • 使算法在该系列中可互换。

    您允许在运行时选择将要使用的数据库(以及行为)。您已经定义了一系列算法(您的接口),封装了每个算法(通过为每个提供者创建一个类),它们可以互换使用,因为 DatabaseModel 仅取决于接口。

    【讨论】:

      【解决方案3】:

      DaoFactory 设计模式非常适合您的实现。

      界面

      public interface DatabaseEngineInterface {
          public void insert(User user);
          public void update(User user);
          public void delete(int userId);
      }
      

      实现上述方法的类:

      public class DatabaseModel implements DatabaseEngineInterface {
          @Override
          public void delete(int userId) {
              // delete user from user table
          }
      
          @Override
          public User[] findAll() {
              // get a list of all users from user table
              return null;
          }
      
          @Override
          public User findByKey(int userId) {
              // get a user information if we supply unique userid
              return null;
          }
      
          @Override
          public void insert(User user) {
              // insert user into user table
          }
      
          @Override
          public void update(User user) {
              // update user information in user table
          }
      }
      

      工厂

      public class DatabaseModelDAOFactory {
              public static UserDAO getUserDAO(String type) { 
              if (type.equalsIgnoreCase("mysql")) {
                  return new UserDAOMySQLImpl();
              } else {
                  return new UserDAOORACLEImpl();
              }
          }
      }
      

      客户端代码:

      然后,在客户端,而不是像这样的硬编码行:

      DatabaseModel userDAO=DatabaseModelDAOFactory.getUserDAODatabaseEngineInterface("jdbc");
      

      您可以拥有一个能够在 DAO 之间动态切换的属性文件,从属性文件中检索该字符串后,您可以简单地执行以下操作:

      DatabaseModel userDAO=DatabaseModelDAOFactory.getUserDaoDatabaseEngineInterface(myStringFromPropertiesFile);
      

      myStringFromPropertiesFile 将根据您的属性文件中的定义包含“mysql”或“oracle”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-24
        • 1970-01-01
        • 2015-06-18
        • 1970-01-01
        • 2016-12-09
        • 1970-01-01
        • 1970-01-01
        • 2012-07-18
        相关资源
        最近更新 更多