Metoda fabryczna to kreacyjny wzorzec projektowy, tj. Związany z tworzeniem obiektów. We wzorcu Factory tworzymy obiekt bez ujawniania logiki tworzenia klientowi, a klient używa tego samego wspólnego interfejsu do tworzenia nowego typu obiektu.
Chodzi o to, aby użyć statycznej funkcji składowej (statycznej metody fabryki), która tworzy & zwraca instancje, ukrywając przed użytkownikiem szczegóły modułów klas.
Wzorzec fabryczny jest jedną z podstawowych zasad projektowania przy tworzeniu obiektu, umożliwiając klientom tworzenie obiektów biblioteki (wyjaśnione poniżej) w taki sposób, że nie ma ścisłego powiązania z hierarchią klas biblioteki.
Co mamy na myśli, gdy mówimy o bibliotece i klientach?
Biblioteka jest czymś, co jest dostarczane przez jakąś firmę zewnętrzną, która udostępnia niektóre publiczne interfejsy API, a klienci wywołują te publiczne interfejsy API w celu wykonania swojego zadania. Bardzo prostym przykładem mogą być różne rodzaje widoków udostępniane przez system operacyjny Android.
Dlaczego wzorzec fabryczny?
Zrozummy to na przykładzie:
Wynik:
I am two wheeler
Jakie są problemy z powyższym projektem?
Jak zapewne zauważyłeś w powyższym przykładzie, Klient tworzy obiekty albo TwoWheeler lub FourWheeler na podstawie pewnych danych wejściowych podczas konstruowania obiektu.
Powiedzmy, biblioteka wprowadza nową klasę ThreeWheeler, aby uwzględnić również pojazdy trójkołowe. Co by się stało? Klient skończy w łańcuchu nowego else, jeśli w drabinie warunkowej utworzy obiekty ThreeWheeler. Co z kolei będzie wymagało ponownej kompilacji klienta. Tak więc za każdym razem, gdy wprowadzana jest nowa zmiana po stronie biblioteki, Klient musiałby wprowadzić odpowiednie zmiany na jej końcu i ponownie skompilować kod. Brzmi źle? To bardzo zła praktyka projektowania.
Jak uniknąć problemu?
Odpowiedź brzmi: utwórz metodę statyczną (lub fabryczną). Zobaczmy poniżej kod.
Wynik:
I am three wheeler
W powyższym przykładzie całkowicie odłączyliśmy wybór typu do utworzenia obiektu od Klienta. Biblioteka jest teraz odpowiedzialna za decydowanie, który typ obiektu utworzyć na podstawie danych wejściowych. Klient musi tylko zadzwonić do fabryki biblioteki Create i przekazać żądany typ, nie martwiąc się o faktyczną implementację tworzenia obiektów.
Podziękowania dla Rumpelsztyka za udzielenie powyższego wyjaśnienia.
Inne przykłady metody fabrycznej:
- Powiedzmy, że w systemie 'Rysowania', w zależności od danych wejściowych użytkownika, można narysować różne obrazy, takie jak kwadrat, prostokąt, koło. Tutaj możemy użyć metody fabrycznej do tworzenia instancji w zależności od danych wejściowych użytkownika. Aby dodać nowy typ kształtu, nie trzeba zmieniać kodu klienta.
- Inny przykład: w witrynie podróżniczej możemy zarezerwować bilet kolejowy, autobusowy i lotniczy. W tym przypadku użytkownik może podać swój typ podróży jako „autobus”, „pociąg” lub „lot”.
Tutaj mamy klasę abstrakcyjną „AnyTravel” ze statyczną funkcją elementu członkowskiego „GetObject”, która w zależności od rodzaju podróży użytkownika będzie utwórz & zwracany obiekt „BusTravel” lub „TrainTravel”. „BusTravel” lub „TrainTravel” mają wspólne funkcje, takie jak imię i nazwisko pasażera, miejsce pochodzenia, parametry celu podróży.
Dzięki Abhijit Saha podał pierwsze dwa przykłady.