Простой метод фабрики против фабрики: оператор переключения между фабрикой и клиентом
Я понимаю, что одним из основных преимуществ метода Factory по сравнению с Simple Factory является то, что он не нарушает принцип Open-Closed 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 сообщений о фабриках, и ни один из них не посвящен этому конкретному различию.
Есть ли лучшее решение, которое не нарушает принцип Open / Closed на стороне клиента или фабрики?