Abstract factory¶
Przeznaczenie
Dostarcza interfejs do tworzenia całych rodzin spokrewnionych lub zależnych od siebie obiektów bez konieczności określania ich klas rzeczywistych
Kontekst
W systemie istnieją rodziny powiązanych ze sobą obiektów-produktów, zaprojektowane tak, by obiekty były używane razem i ograniczenie to powinno być zachowane
System powinien być niezależny od tego, jak jego produkty są tworzone, składowane i reprezentowane
Problem
Chcemy umożliwić konfigurację systemu przy użyciu jednej z wielu rodzin produktów
Kod powinien być zależny od interfejsów lub klas abstrakcyjnych
Chcemy dostarczyć bibliotekę klas produktów, ujawniając tylko ich interfejsy, a nie implementacje
Struktura¶

Uczestnicy¶
AbstractFactory – deklaruje interfejs tworzenia produktów abstrakcyjnych
ConcreteFactory – implementuje operacje tworzenia produktów konkretnych
Product – klasa abstrakcyjna definiująca interfejs dla pewnego rodzaju produktu
ProductA, ProductB
definiuje obiekt będący produktem, który ma być utworzony przez odpowiednią fabrykę konkretną
dziedziczy po klasie abstrakcyjnej Product
Client – używa jedynie klas abstrakcyjnych AbstractFactory i Product
Współpraca¶
Podczas wykonywania programu jest zwykle tworzony jeden egzemplarz klasy ConcreteFactory - ta konkretna fabryka tworzy obiekty-produkty o pewnej szczególnej implementacji
AbstractFactory zdaje się w kwestii tworzenia produktów na swoją podklasę (ConcreteFactory)
Konsekwencje¶
Odseparowanie klas konkretnych. Pomaga zapanować nad tym, jakie klasy obiektów tworzy dana aplikacja. Ponieważ fabryka kapsułkuje odpowiedzialność i proces tworzenia obiektów-produktów, izoluje klientów od klas implementujących.
Łatwiejsza wymiana rodzin produktów. Klasa fabryki konkretnej pojawia się w aplikacji tylko raz – tam, gdzie są tworzone jej obiekty. Umożliwia to łatwą zmianę fabryki konkretnej używanej przez aplikację.
Spójność produktów. Współpraca produktów wymaga, by aplikacja używała za jednym razem obiektów tylko z danej rodziny
Utrudnione dołączenie nowych produktów. Interfejs AbstractFactory ustala zbiór obiektów, które mogą być utworzone. Obsługa nowych rodzajów produktów wymaga rozszerzenia interfejsu fabryki, co z kolei pociąga reimplementacje wszystkich podklas.