【问题标题】:How Factory Method pattern make code maintainable in this case在这种情况下,工厂方法模式如何使代码可维护
【发布时间】:2020-01-06 14:47:39
【问题描述】:

我是设计模式的新手,我正在读一本书说: 在一个应用程序中,您可能有不同的数据库用户。例如,一位用户可能使用 Oracle 和其他可能使用 SQL Server。每当您需要将数据插入到您的 数据库,您需要创建 SqlConnection 或 OracleConnection 并且仅 那么你可以继续吗?如果将代码放入 if-else(或 switch)语句中,则需要重复大量代码,这不容易维护。这是因为每当你 需要支持一种新的连接类型,你需要重新打开你的代码并使那些 修改。这种类型的问题可以使用工厂方法模式来解决。

这里我有点迷茫,如果你需要使用一种新的连接类型,你不要只添加那个连接类的新类文件(例如

NEWGenerationConnection),然后使用NewGenerationConnection connection = new NewGenerationConnection(connectionString); connection.open(); .... if-else 是如何参与进来的?以及为什么需要修改基本代码文件?有人可以为我写一些伪代码,以便我更好地理解问题吗?

【问题讨论】:

    标签: design-patterns factory-method


    【解决方案1】:

    这里的重点是集中可能更改的代码块。如果您将相同的 if-else 块分散在多个类周围,那么如果以后需要对其进行更改,则必须在所有位置进行更改。 IDE 为您提供查找和替换实用程序,但即使在这种情况下,它也不是一个好习惯,至少因为需要单独编译。

    使用工厂模式,您可以将 if-else 逻辑放在一个地方,并将您从工厂获得的多态超类型对象传递给您的类,然后您将使用动态调度的好处,例如策略或模板方法模式。

    让我们看看例子(为了简洁起见,这是一个基本的例子,所以我没有重构无关的东西):

    public class ConnectionPolicyFactory {
    
        public ConnectionPolicy getPolicy(String dbVendor) {
            if (dbVendor == "ORACLE") {
                return new OracleConnectionPolicy();
            } else if (dbVendor == "SQL_SERVER")) {
                return new SqlServerConnectionPolicy();
            }
            //exceptional cases
        }
    
    }
    

    然后在客户端:

    ConnectionPolicyFactory connectionPolicyFactory = new ConnectionPolicyFactory();
    
    //this is the parent of Connection types.
    ConnectionPolicy connectionPolicy = connectionPolicyFactory.getPolicy("ORACLE");//which is OracleConnectionPolicy
    
    MyClass myClass = new MyClass();
    myClass.foo(connectionPolicy);
    

    那么在你的课堂上,你可能正在做类似的事情:

    public class MyClass {
       //...
    
       public void foo(ConnectionPolicy conn) {
          conn.someVendorSpecificAction();
       }
    
       //...
    
    }
    

    如果您不使用工厂并且可能有更多类使用此 ConnectionPolicy,那么您的所有类中都会包含所有 if-else 逻辑。

    【讨论】:

      猜你喜欢
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多