Załóżmy, że mam napój klasy abstrakcyjnej i metodę fabryczną, która wybiera rodzaj napoju (wino, piwo itp.) Do utworzenia w czasie wykonywania.Przekazywanie argumentów do konkretnej podklasy za pomocą metody fabrycznej
Każdy drink potrzebuje kilku argumentów, aby poprawnie się zainicjować. Niektóre z nich są wspólne dla wszystkich napojów; na przykład wszystkie mogą wymagać argumentu DrinkConfig.
Ale każdy napój może mieć swoje własne unikalne wymagania. Może Wine potrzebuje obiektu pomocnika Sommeliera, aby się zainicjować. Piwo nie potrzebuje tego, ale może potrzebować własnych obiektów pomocniczych.
Co powinienem przejść do metody fabrycznej? Kiedy to nazywam, mam dostępne wszystkie obiekty pomocnicze, więc mogłem po prostu przekazać je wszystkie do fabryki. Ale może to oznaczać wiele kłótni. Czy istnieje lepszy sposób na zaprojektowanie tego?
EDYCJA: Załóżmy, że nie mogę po prostu tworzyć obiektów pomocniczych w fabryce; są dostępne tylko od dzwoniącego.
Podpisy są w porządku. Problem polega na tym, w jaki sposób przekazujesz argumenty do swojego Factory :: CreateDrink() (lub jakkolwiek to się nazywa). – dirkgently
Jeśli chcesz mieć metodę CreateDrink w fabryce, możesz użyć parametru wyliczeniowego, aby określić, jaki rodzaj napoju chciałeś. Nie wierzę w to, czy powyższe podejście jest zgodne z wzorcem fabryk GoF, w którym przedmioty powstają w klasie Drink (muszę dziś sprawdzić moją książkę), ale uważam, że jest to o wiele bardziej pragmatyczne i nadal utrzymuje główną korzyść centralizacji tworzenia obiektów dla hierarchii podklasowych. – sipwiz
Po sprawdzeniu mojej książki GoF Design Patterns cieszę się, że powyższy przykład podałem w przybliżeniu, w jaki sposób używasz Fabryki jako części wzorca projektu Abstrakt Factory. Aby całkowicie się zgadzać, powinna istnieć abstrakcyjna klasa fabryczna, z której dziedziczy DrinkFactory, ale w prostych przypadkach, takich jak ten, zwykle go pomijam. Łatwo byłoby refakturować DrinkFactory, gdyby potrzebna była inna fabryka betonu. – sipwiz