我知道工厂方法相对于简单工厂的主要优势之一是它不违反开闭 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 帖子,但没有一个解决这个特定的区别。
有没有更好的解决方案在客户端或工厂端都不会违反开放/封闭原则?