Factory Method (Metoda Wytwórcza)

Narzędzie

Factory Method – kreacyjny wzorzec projektowy, w którym podklasy mogą zmieniać typ tworzonych obiektów, a klasa bazowa udostępnia interfejs do ich tworzenia.

Przeznaczenie i warunki stosowania

Proces tworzenia egzemplarzy produktów, jest przekazany podklasom które determinują klasę danego obiektu – produktu. Wszystkie produkty implementują ten sam interfejs, który ma sens dla każdego produktu

Metodę Wytwórczą użyj jeśli:

  • z góry nie wiesz jaki będzie typ obiektów – produktów i jakie będą między nimi zależności
  • ustalenie jakie obiekty trzeba utworzyć jest nie możliwe w danej klasie bazowej
  • chcesz aby to podklasy określały tworzone obiekty

Metoda Wytwórcza a inne wzorce

Metoda Wytwórcza często wykorzystywana jest na początku projektu/rozwiązania. Dodawanie kolejnych metod kreacyjnych do Wytwórcy zbliża kod do Fabryki Abstrakcyjnej. Możliwa jest też ewolucja we wzorzec Prototyp lub bardziej skomplikowany Budowniczy.

Wyspecjalizowana Metoda Szablonowa lub jeden z jej etapów może być Metodą Wytwórczą.

Metoda Wytwórcza nie wymaga inicjalizacji i bazuje na dziedziczeniu, w przeciwieństwie do Prototypu, który wymaga wyspecjalizowanej inicjalizacji i nie bazuje na dziedziczeniu.

Życiowa Analogia

Wyobraźmy sobie, że chcesz wywiercić otwór (Creator.SomeOperation()). Aby go wykonać musisz wziąć (FactoryMethod()) do ręki narzędzie, które będzie to wstanie zrobić (spełnia interfejs produktu „może wiercić”). W zależności od potrzeby / materiału w jakim chcesz wywiercić otwór wybierzesz inną walizkę z narzędziem (Concrete Creator). Dla otworu w drewnie, wybierzesz wkrętarkę, a w betonie z pewnością specjalną wiertarkę z udarem. Z każdej walizki narzędziowej (Concrete Creator) możesz wziąć (FactoryMethod()) narzędzie (Concrete Product) spełniające dane wymaganie (Product, interface, „może wiercić”), którym następnie wywiercimy otwór (SomeOperation()).

Factory Method Struktura

  • Creator – Wytwórca
    • wywołuje metodę wytwórczą w celu stworzenia obiektu Produkt
    • zawiera deklarację metody wytwórczej zwracającej obiekt typu Produkt
      • może zawierać implementację domyślną
  • Concrete Creator – Wytwórca Konkretny
    • przesłania metodę wytwórczą zwracając Produkt Konkretny
  • Product – Produkt
    • interfejs obiektu tworzonego przez metodę wytwórczą
  • Concrete Product – Produkt Konkretny
    • implementacja interfejsu Produkt
    • zwracany przez Wytwórcę Konkretnego
Struktura Wzorca Factory Method (Metoda Wytwórcza)

Factory Method Konsekwencje Stosowania

Pozytywne:

  • Połączenie równoległych hierarchii klas
    • Tównoległość pojawia się gdy część zadań klasy jest delegowane do odrębnej klasy
  • Zagwarantowanie punktów zaczepienia dla podklas
    • Tworzenie produktów odbywa się w jednym miejscu w metodzie wytwórczej
  • SOLID friendly
    • Kod który korzysta z produktów jest oddzielony od kodu je konstruującego
    • Kod kreacyjny jest w jednym miejscu
  • Dodanie nowego produktu przez jedynie stworzenie nowej podklasy i implementacji metody wytwórczej

Negatywne

  • Konieczność tworzenia podklasy klasy Creator jedynie w celu stworzenia określonego obiektu konkretnego.
  • Możliwość komplikacja kodu w przypadku licznych podklas kreacyjnych
Odbierz darmowy eBook

Factory Method Implementacja

W głównych punktach, implementacja wzorca Abstract Factory, opiera się o:

  • Creator – Kreator – CarCreator
    • klasa abstrakcyjna z deklaracją Metody Wytwórczej
    • Factory Method – Metoda Wytwórcza – FactoryMethod()
  • Concrete Creator – Kreator Konkretny – AudiCreator, BMW Creator
    • nadpisuje Metodę Wytwórczą
  • Concrete Product – Produkt Konkrenty – AudiCar, BMWCar
  • Product – Produkt – Car (interfejs)
  • Client – Klient – Kod kliencki, który może pracować już na otrzymanym wcześniej Kreatorze Konkretnym(przekazany w konstruktorze), lub samemu decydować jaki Kreator Konkretny użyć

Powyższy przykład jest oczywiście bardzo uproszczony i ma jedynie na celu ukazanie Tobie mechanizmów tworzących Metod Wytwórczą. Słuszne są tu spostrzeżenia i analogie do wzorca Fabryki Abstrakcyjnej, przy czym tutaj mamy do czynienia z dziedziczeniem, a tam implementacją wspólnego interfejsu.

Podsumowanie

Niewątpliwie Metoda Wytwórcza przypomina Fabrykę Abstrakcyjną, jednak idea działania jest zdecydowanie prostsza. W przeciwieństwie do Fabryki, nie skupia się na tworzeniu współdziałających rodzin produktów, a produktów spełniających określony interfejs.

Ważne abyś samemu zastanowił się i przemyślał, czy Factory Method to wzorzec projektowy który pasuje do Twojego problemu, czy może inny Wzorzec Projektowy byłby lepszy, a może prosty kod będzie wystarczający? Znajomość wzorców z pewnością pomoże Tobie w tych przemyśleniach.

Zainteresował Cię materiał? Zapraszam do listy mailowej, by być na bieżąco z kolejnymi wpisami.

Subscribe
Powiadom o
guest
0 komentarzy
Inline Feedbacks
View all comments