Metoda wytwórcza – Wzorzec Projektowy (Factory Method)

Metoda wytwórcza (ang. Factory Method) – wzorzec projektowy. Przykład zastosowania oparty na historii w celu łatwiejszego zrozumienia tego wzorca dla laika. Przed przystąpieniem do czytania tego wpisu zalecam przeczytać wpis o Fabryce Abstrakcyjnej.

James miał firmę, która zajmowała się składaniem i sprzedawaniem hulajnóg. Hulajnoga składa się z czterech elementów: kierownicy, kolek, hamulca i naklejki. Elementy do hulajnóg James zamawiał u dwóch różnych producentów: polskiego i chińskiego (aby zrozumieć dlaczego zastosowane jest dziedziczenie zapraszam do przeczytania wpisu o Fabryce Abstrakcyjnej).

Klasy polskich produktów:

Klasy chińskich produktów.

Na początku istnienia firmy, aby zbudować jedną hulajnogę wszystkie części musiały pochodzić od jednego producenta, na przykład polskiego.

Lub chińskiego.

Sama hulajnoga wyglądała w następujący sposób:

Budowa polskiej hulajnogi nie była skomplikowana:

Jednak wraz z rozwojem firmy James znalazł rozwiązanie, które pozwalało budować hulajnogi z części które pochodziły od różnych producentów. Jak to robił James?

Po pewnym czasie okazało się, że ludzie uwielbiają sami komponować własne hulajnogi. James zauważył, że aby biznes szybciej się rozwijał to warto dać możliwość klientom, aby sami wybierali części do budowy swoich hulajnóg od różnych producentów. James rozszerzył możliwość wybierania części o innych producentów: włoskiego, szwajcarskiego lub norweskiego. James znalazł firmy, które produkowały poszczególne części: WloskaFabryka, SzwajcarskaFabryka, NoweskaFabryka. W tym momencie części mogły być sprowadzane z 5 różnych fabryk: polskiej, chińskiej, włoskiej, szwajcarskiej, norweskiej. Powiedzmy, że przychodzi klient i mówi: „chcę polskie kółka, szwajcarską kierownice, włoskie hamulce i chińską naklejkę.” Jak James zamawiał te elementy ? Jak powstawała hulajnoga?

Po chwili przyjdzie inny klient i zażyczy sobie norweską kierownicę i hamulce, polskie kółka i włoską naklejkę.
I ponownie James musi zwrócić się do odpowiedniej fabryki z prośba o konkretny element. O błąd tutaj nie jest trudno.

Metoda Wytwórcza – Refactoring

Nagle James przypomniał sobie, że kiedyś dostał ulotkę od firmy „KreatorKolek”. Firma ta jest wyspecjalizowana w tworzeniu kółek różnego pochodzenia. James skontaktował się z tą firmą, aby zrozumieć jak ona działa. Firma KreatorKolek zaprosiła James do swojej hali produkcyjnej, aby mógł zobaczyć jak to wszystko wygląda.

Genialne! A jak James może zamówić na przykład polskie kółka?

James pomyślał, że to znakomite rozwiązanie. Nie musi kontaktować z rożnymi firmami w celu zamówienia jednej konkretnej części. Wystarczy, że skontaktuje się z KreatoremKolek i otrzyma kółko jakie chce. James pomyślał, ze skoro istnieje firma KreatorKolek to na pewną istnieją również firmy KreatorHamulcow, KreatorNaklejek oraz KreatorKierownic. James nie mylił się.

Zamawianie działo tak samo jak w przypadku KreatoraKolek:

Pozostałe dwie firmy: KreatorHamulcow oraz KreatorKierownic działały w identyczny sposób.
Więc jak można zamówić elementy do hulajnogi i ją złożyć?

Jeżeli w katalogu pojawią się na elementy produkty z innych państw to w łatwy sposób można je dodać do programu.

Oczywiście trzeba będzie również stworzyć odpowiednie klasy dla IrlandzkieNaklejki i NiemieckieNaklejki.

Co jeszcze można zmienić? Zamiast używać stringów jako argumentów do metod „StworzCośTam()” można zrobić bardziej eleganckie rozwiązanie jakim jest enumerator.

Poprawmy kod na przykład metody StworzNaklejki().

Zobaczmy jak teraz można zamawiać produkty i stworzyć z nich hulajnogę.

Zapomnieliśmy o Jamesie. Jamesie jako klasie w programie. James jest klientem firm KreatorKolek, KreatorNaklejek, KreatorHamulców i KreatorKierownic.

I na koniec sprawdźmy czy działa nasz program i się kompiluje.

Metoda Wytwórcza – trochę teorii:

Metoda wytwórcza
Źródło: msdn.microsoft.com/

Odnieśmy ten diagram UML do naszego przykładu.

Klient jako Client
KreatorKolek jako Creator
Kolka jako IProduct
PoslskieKolka jako ProductA
ChinskieKolka jako ProductB

Diagram nie do końca oddaje tego co jest w kodzie. Po pierwsze zamiast interfejsu mamy po prostu klasę abstrakcyjna. Moglibyśmy mieć również ProductC (IrlandzkieKolka), ProductD (NiemieckieKolka) itd. Diagram rozpatruje tylko przykład kolek.
Wzorzec ten został opisany przez Bandę Czworga (Gang of Four). Wzorzec projektowy Metoda Abstrakcyjna należy do wzorców kreacyjnych. Wzorzec ten zajmuje się tworzeniem wyspecjalizowanych instancji produktów.
Jaka różnica pomiędzy fabryką abstrakcyjną, a metodą wytwórczą? Fabryka abstrakcyjna tworzy obiekty pochodzące z jednej rodziny, np. tylko polskie produkty (kółka, naklejki, kierownica, hamulce). Fabryka abstrakcyjna ma kilka metod które tworzą różne instancje obiektów. Metoda wytwórcza zajmuje się tworzeniem tylko jednego obiektu. Klasa metody wytwórczej ma tylko jedna metodę, która zwraca jeden konkretny obiekt. Dodatkowo w fabryce abstrakcyjnej ConcreteFactory1, ConcreteFactory2 (klasy, które tworzą obiekty) dziedziczą po klasie AbstactFactory. W metodzie wytwórczej klasa Creator (powiedzmy taki odpowiednik ConcreteFactory) nie dziedziczy po żadnym interfejsie czy klasie.

Metoda Wytwórcza – przydatne linki:

DoFactory – przykład (ang)
CodeProject – przykład (ang)
MSDN – przykład (ang)
CodeProject – różnice pomiędzy Fabryką Abstrakcyjną, a Metodą Wytwórczą (ang)
StackOverflow – różnice pomiędzy Fabryką Abstrakcyjną, a Metodą Wytwórczą 1
StackOverflow – różnice pomiędzy Fabryką Abstrakcyjną, a Metodą Wytwórczą 2

Powered by: Wordpress