Я понимаю, что одним из основных преимуществ Factory Method по сравнению с Simple Factory является то, что он не нарушает открытый принцип 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;
}
В этом случае клиент должен быть изменен каждый раз, когда добавляется новый тип, а в предыдущем случае завод должен был быть изменен. Так в чем же преимущество тогда одного над другим? Пожалуйста, не отмечайте это как дубликат, я просмотрел много сообщений о фабриках, и никто не обращается к этому конкретному различию.
Есть ли лучшее решение, которое не нарушает принцип Open/Closed на стороне клиента или на заводе?
Это по существу вариант моего второго варианта выше. Причина, по которой это не работает для меня, заключается в том, что в моем случае «клиент» фабрики фактически является веб-API. Клиент Web API («клиентский клиент») будет определяющим фактором для типа объекта, поэтому я не вижу способа его инжекции, не делая переключения на тип объекта, независимо от того, находится ли он в api, который создает IFactory или на самом заводе. – mayabelle
Как клиенты определяют тип объекта? – GFranke
Клиент передает тип объекта, который они хотят получить в api. Тип объекта - значение перечисления. – mayabelle