在这种情况下,工厂方法模式如何使代码可维护

How Factory Method pattern make code maintainable in this case

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

我在这里有点困惑,如果你需要使用一种新的连接类型,你不只是添加一个新的 class 该连接的文件 class (例如

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

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

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

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

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);

那么在您的 class 中,您可能正在做类似的事情:

public class MyClass {
   //...

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

   //...

}

如果您没有使用工厂,并且当您可能有更多 classes 使用此 ConnectionPolicy 时,那么您将在所有 classes 中拥有所有 if-else 逻辑。