Rozumiem, że jedną z głównych zalet metody fabryki w porównaniu z prostą fabryką jest to, że nie narusza ona zasady Open-Closed SOLID. Oznacza to, że ta pierwsza nie wymaga modyfikacji instrukcji switch, gdy dodawane są nowe typy.Metoda prosta fabryka a metoda fabryczna: Instrukcja przełączania w przypadku klienta fabrycznego
Jest jeden artykuł, w którym mam nadzieję uzyskać wyjaśnienia. Gdybym miał użyć prostego fabrykę, chciałbym mieć fabrykę takiego (uproszczony):
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;
}
}
}
a klient nazwałbym to tak:
IObject myObject = ObjectFactory.CreateObject(objectType);
Wadą w literaturze jest to, że Obiekt CreateObject będzie musiał zostać zmodyfikowany po dodaniu nowych typów obiektów.
Ale metoda fabryki, to nie możemy być po prostu przesuwając tę zmianę z fabryki do klienta, jak ten (kod klienta):
IObject myObject;
switch (objectType) {
case TypeA:
myObject = ObjectAFactory.CreateObject();
break;
case TypeB:
myObject = ObjectBFactory.CreateObject();
break;
case TypeC:
myObject = ObjectCFactory.CreateObject();
break;
}
W tym przypadku klient będzie musiał zostać zmodyfikowany za każdym razem, gdy zostanie dodany nowy typ, w porównaniu do poprzedniego przypadku konieczna będzie modyfikacja fabryki. Więc jaka jest przewaga jednej nad drugą? Proszę nie oznaczać tego jako duplikatu, przyjrzałem się wielu postom dotyczącym SO na temat fabryk i żadne z nich nie odnosi się do tego konkretnego rozróżnienia.
Czy istnieje lepsze rozwiązanie, które nie narusza zasady Open/Closed po stronie klienta lub fabryki?
Jest to zasadniczo odmiana mojej drugiej opcji powyżej. Powodem, dla którego to nie działa, jest to, że w moim przypadku "klient" fabryki to tak naprawdę interfejs Web API. Klient Web API ("klient klienta") będzie decydował o tym, jaki jest typ obiektu, więc nie widzę sposobu, aby go wprowadzić bez zmiany typu obiektu, bez względu na to, czy jest to api, które tworzy Pouczający lub w samej fabryce. – mayabelle
Jak klienci określają typ obiektu? – GFranke
Klient przekazuje typ obiektu, który chce, do api. Typ obiektu to wartość wyliczeniowa. – mayabelle