【发布时间】:2015-02-17 17:52:57
【问题描述】:
我知道,与简单工厂相比,工厂方法的主要优势之一是它不违反开闭 SOLID 原则。即前者在添加新类型时不需要修改switch语句。
有一件我希望得到澄清。如果我要使用一个简单的工厂,我会有一个这样的工厂(简化):
public class ObjectFactory {
public static IObject CreateObject(ObjectTypeEnum objectType) {
switch (objectType) {
case TypeA:
return ObjectA;
break;
case TypeB:
return ObjectB;
break;
case TypeC:
return ObjectC;
break;
}
}
}
客户会这样称呼它:
IObject myObject = ObjectFactory.CreateObject(objectType);
文献中的缺点是添加新对象类型时需要修改 CreateObject。
但是使用工厂方法,我们不只是将这个修改从工厂转移到客户端,就像这样(客户端代码):
IObject myObject;
switch (objectType) {
case TypeA:
myObject = ObjectAFactory.CreateObject();
break;
case TypeB:
myObject = ObjectBFactory.CreateObject();
break;
case TypeC:
myObject = ObjectCFactory.CreateObject();
break;
}
在这种情况下,每次添加新类型时都需要修改客户端,而在前一种情况下,需要修改工厂。那么,一个比另一个有什么优势呢?请不要将其标记为重复,我查看了许多关于工厂的 SO 帖子,但没有一个解决这个特定的区别。
有没有更好的解决方案,在客户端或工厂端都不会违反开放/封闭原则?
【问题讨论】:
-
我也遇到了同样的问题。如果仍然使用
switch语句,看起来factory method模式仍然违反了开闭原则。也就是说,我们还是需要修改代码。
标签: design-patterns factory factory-pattern solid-principles open-closed-principle