在这种情况下,工厂方法模式如何使代码可维护
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 逻辑。
我是设计模式的新手,我在看一本书说: 在一个应用程序中,您可能有不同的数据库用户。例如,一个用户可以使用 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 逻辑。