Wzorzec Fabryka
15 października, 2022 14:48 | by Agnieszka | Posted in Wzorce projektowe

Wzorce z rodziny wzorców fabrykujących służą do tego aby oddelegować tworzenie nowych obiektów do innych klas tak aby użytkownik musiał tylko zawołać jedną metodę i otrzymał gotowy obiekt. Jest to przydatne w momencie gdy mamy do stworzenia obiekt, który jest powiązany z wieloma innymi obiektami. Dzięki wykorzystaniu fabryki można ukryć szczegóły implementacyjne tworzenia obiektów i odseparować je od logiki biznesowej.
Implementacje wzorca Fabryka:
1. Prosta Fabryka (ang. Simple Factory) – klasa Fabryka bezpośrednio tworzy obiekty – dodawanie, modyfikowanie, utrzymanie kodu jest dość trudne
2. Metoda wytwórcza (ang. Factory Method) – tworzymy interfejs nadrzędny, który pozwala decydować klasom podrzędnym o tworzenie obiektu. Dzięki temu możliwe jest zdefiniowanie części wspólnej oraz części specyficznych dla konkretnych podklas. Proponuje on zmianę bezpośrednich wywołań konstruktorów obiektów na wywołania specjalnej metody wytwórczej.
Najpierw tworzymy interfejs lub podklasę fabryki.
Następnie implementujemy konkretną klasę.
Tworzymy implementację konkretnej fabryki.
Zastosowanie:
– gdy z góry wiadomo jakie typy obiektów pojawią się w programie i jakie będą między nimi zależności
– gdy zamierzamy pozwolić użytkującym bibliotekę lub framework rozbudowywać jej wewnętrzne komponenty
– gdy chcemy oszczędniej wykorzystać zasoby systemowe poprzez ponowne wykorzystanie już istniejących obiektów, zamiast odbudowywać je raz za razem.
Zalety:
– unikamy ścisłego sprzęgnięcia pomiędzy twórcą a konkretnymi produktami
– zasada pojedynczej odpowiedzialności
– brak powtarzalności, ukrycie logiki pomiędzy warstwami
– otwarte na rozbudowę /zamknięte na modyfikacje
Wady:
– kod może się skomplikować, ponieważ aby zaimplementować wzorzec musisz utworzyć liczne podklasy. W najlepszej sytuacji wprowadzimy ten wzorzec do już istniejącej hierarchii klas kreacyjnych
3. Fabryka abstrakcyjna (ang. Abstract Factory) – zwraca wiele różnych powiązanych ze sobą obiektów (fabryka wielu fabryk – interfejs posiada jeden lub wiele Factory Methods). Pozwala tworzyć rodziny spokrewnionych ze sobą obiektów bez określenia ich konkretnych klas.
Najpierw tworzymy interfejs abstrakcyjnej fabryki.
Następnie tworzymy interfejsy produktów.
Implementujemy konkretną fabrykę
oraz konkretne produkty
To samo dla drugiej fabryki:
Klasa służąca do wyboru konkretnej fabryki abstrakcyjnej:
Zastosowanie:
– gdy kod ma działać na produktach z różnych rodzin, ale jednocześnie nie chcemy aby ściśle zależał id konkretnych klas produktów. Mogą one być nieznane na wcześniejszym etapie tworzenia programu, albo chcemy umożliwić przyszłą rozszerzalność aplikacji
Zalety:
– produkty jakie otrzymujemy stosując fabrykę są ze sobą kompatybilne
– zapobiegamy ścisłemu sprzęgnięciu konkretnych produktów z kodem klienckim
– brak powtarzalności, ukrycie logiki pomiędzy warstwami
– zasada pojedynczej odpowiedzialności
– otwarte na rozbudowę /zamknięte na modyfikacje – możemy wprowadzić wsparcie dla nowych wariantów produktów bez psucia istniejącego kodu klienckiego
Wady:
– kod może się skomplikować – wynika to z konieczności wprowadzenia wielu nowych interfejsów i klas w toku wdrażania tego wzorca projektowego.