Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 在这种情况下,工厂方法模式如何使代码可维护_Design Patterns_Factory Method - Fatal编程技术网

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

Design patterns 在这种情况下,工厂方法模式如何使代码可维护,design-patterns,factory-method,Design Patterns,Factory Method,我不熟悉设计模式,我在读一本书,书上说: 在应用程序中,可能有不同的数据库用户。例如,一个用户可以使用 Oracle,另一个可能使用SQL Server。每当您需要将数据插入到 数据库中,您需要创建SqlConnection或OracleConnection,并且 那你可以继续了。如果将代码放入If-else(或switch)语句中,则需要重复大量代码,这不容易维护。这是因为每当你 如果您需要支持新类型的连接,则需要重新打开代码并使其 修改。这类问题可以使用Factory方法模式解决。 我在这里

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

我在这里有点困惑,如果你需要使用一种新的连接类型,你不需要为这个连接类添加一个新的类文件吗

NEWGenerationConnection),然后只需使用
NEWGenerationConnection=newnewnewgenerationconnection(connectionString);
connection.open();
....

如果还有其他人参与进来怎么办?为什么需要修改基本代码文件?有人能帮我写一些伪代码,让我更好地理解这个问题吗?

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

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

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

公共类ConnectionPolicyFactory{
公共连接策略getPolicy(字符串dbVendor){
if(dbVendor==“ORACLE”){
返回新的OracleConnectionPolicy();
}else if(dbVendor==“SQL\U服务器”)){
返回新的SqlServerConnectionPolicy();
}
//例外情况
}
}
然后在客户端:

ConnectionPolicyFactory ConnectionPolicyFactory=new ConnectionPolicyFactory();
//这是连接类型的父级。
ConnectionPolicy ConnectionPolicy=connectionPolicyFactory.getPolicy(“ORACLE”)//哪个是OracleConnectionPolicy
MyClass MyClass=新的MyClass();
myClass.foo(连接策略);
那么在你的课堂上,你可能正在做一些类似的事情:

公共类MyClass{
//...
公共无效foo(连接政策连接){
连接某些供应商规格();
}
//...
}
如果您没有使用工厂,并且可能有更多的类使用此ConnectionPolicy,那么您的所有类中都会有所有If-else逻辑