Wzorzec projektowy Fabryka

Pod hasłem wzorzec projektowy Fabryka, zawiera się kilka wzorców:

  • prosta fabryka (simple factory)
  • metoda fabrykująca/wytwórcza (factory method)
  • fabryka abstrakcyjna (abstract factory)

Kiedy korzystamy z operatora „new”, tworzymy obiekt, który jest reprezentacją konkretnej klasy. Jest to tworzenie implementacji, a nie interfejsu. Takie podejście powoduje, że nasz kod staje się wrażliwy na zmiany i mniej elastyczny.

Prosta fabryka

Przyjrzyjmy się poniższemu przykładowi:

Wszystko ładnie działa do czasu, aż nie dojdzie nowy producent i będzie trzeba dopisać kolejny warunek. Zostanie złamana wtedy, jedna z zasad SOLID– open/closed.

System powinien być otwarty na rozbudowę, ale zamknięty na modyfikacje.

Z pomocą przychodzi nam fabryka, która w zależności od warunku, będzie zwracała odpowiedniego producenta.

Rozwiązanie może wydawać się nadmiarowe, ponieważ przenieśliśmy kawałek kodu do zupełnie nowej klasy i jeszcze dodaliśmy do tego interfejs. Jednak wyodrębniliśmy logikę wyboru producenta laptopa i zyskaliśmy możliwość dynamicznego zmienia implementacji podczas działania programu.

Metoda wytwórcza

Wzorzec ten hermetyzuje proces tworzenia obiektów, które są ze sobą powiązane. Pozwala klasom podrzędnym decydować, jaki obiekt zostanie utworzony. Wzorzec przekazuje odpowiedzialność za tworzenie obiektów do klas podrzędnych.

Problem

Mamy przygotować program, który będzie wybierał najbliższy magazyn, z którego ma zostać zabrany laptop. Dostawców może być wielu, tak samo jak magazynów.

Rozwiązanie

Mamy do wyboru trzy magazyny: Europejski, Azjatycki oraz Amerykański- każda z klas rozszerza klasę Magazyn.

Następnie mamy interfejs IDostawcaLaptopow, który dla podanego producenta, zwraca odpowiedni magazyn.

Dzięki takiemu podejściu, zyskujemy niezależność od konkretnych implementacji zasobów.

Fabryka abstrakcyjna

Wzorzec ten dostarcza interfejs do tworzenia rodzin spokrewnionych lub zależnych od siebie obiektów bez konieczności określania ich klas rzeczywistych.

Problem

Chcemy napisać kod, który będzie nadzorował proces tworzenia laptopa. Jak wiadomo, laptop składa się z procesora, dysku twardego i pamięci RAM (taki prosty komputerek, idealny na przykład).

Rozwiązanie

Na początek interfejs naszej fabryki. Musi ona tworzyć wszystkie podzespoły. Klasa DyskTwardy, Procesor oraz PamiecRam, to abstrakcyjne klasy. W implementacji IFabrykaLaptopa, metody będą zwracały konkretne rozszerzenia abstrakcyjnych klas.

Przykładowe implementacje fabryki abstrakcyjnej:

Kiedy mamy już nasze fabryki, czas je wykorzystać. Do metody Stworz w klasie Laptop, wstrzykujemy interfejs fabryki, które zapewni nam wybór odpowiednich podzespołów.

Następnie, stwórzmy dwa laptopy i zerknijmy na rezultat.

fabryka_abstrakcyjna_wynik

Dzięki zastosowaniu fabryki abstrakcyjnej, umożliwiliśmy klientowi, stworzenie spokrewnionych produktów bez znajomości szczegółów dotyczących tworzonych produktów. Spowodowało to, że kod klienta jest całkowicie oddzielony od jakichkolwiek szczegółów implementacji produktów rzeczywistych.

Podsumowanie

  • Wszystkie fabryki powodują hermetyzację procesu tworzenia obiektów.
  • Prosta fabryka jest sposobem na oddzielenie klienta od implementacji klas rzeczywistych.
  • Metoda wytwórcza wykorzystuje mechanizm dziedziczenia: tworzenie obiektów jest delegowane do klas podrzędnych, implementujących metodę fabrykującą.
  • Celem metody wytwórczej jest zezwolenie superklasie na przekazywanie odpowiedzialności za tworzenie obiektów do klas podrzędnych.
  • Fabryka abstrakcyjna wykorzystuje kompozycję obiektów: tworzenie obiektów zostało zaimplementowane w metodach dostępnych poprzez interfejs fabryki.
  • Celem fabryki abstrakcyjnej jest tworzenie rodzin spokrewnionych obiektów bez konieczności polegania na ich klasach rzeczywistych.

Bibliografia:

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s