Wzorce kreacyjne Flashcards
Wzorce kreacyjne
• budowniczy • fabryki -> prosta fabryka* -> metoda wytwórcza -> fabryka abstrakcyjna • prototyp • singleton
Budowniczy - nazwa
ang. builder
Budowniczy - kategoria
obiektowy, konstrukcyjny
Budowniczy - Przeznaczenie
Oddzielenie tworzenia złożonego obiektu od jego reprezentacji, dzięki czemu proces konstrukcji może prowadzić do powstawania różnych reprezentacji.
Budowniczy - Uzasadnienie
Edytory dokumentów tekstowych powinny obsługiwać wiele formatów plików.
Liczba możliwości jest nie do określenia, powinna być możliwość dodania obsługi nowych rozszerzeń.
Budowniczy - Warunki stosowania
• gdy istnieje potrzeba zbudowania złożonego obiektu (tzw. kompozytu)
-> NIE TWORZYĆ super klasy, łamie SOLID!
• jeśli algorytm tworzenia obiektu złożonego powinien być niezależny od składników tego obiektu i sposobu ich łączenia;
• kiedy proces konstrukcji musi umożliwiać tworzenie różnych reprezentacji generowanego obiektu;
Budowniczy - Elementy
• Budowniczy (Builder):
- określa interfejs abstrakcyjny do tworzenia składników obiektu Product.
• KonkretnyBudowniczy (ConcreteBuilder):
- tworzy i łączy składniki produktu w implementacji interfejsu klasy Budowniczy;
- definiuje i śledzi generowane reprezentacje;
- udostępnia interfejs do pobierania produktów.
• Kierownik (Director):
- tworzy obiekt za pomocą interfejsu klasy Budowniczy.
• Produkt (Product):
- reprezentuje generowany obiekt złożony; klasa KonkretnyBudowniczy tworzy wewnętrzną reprezentację produktu i definiuje proces jej składania;
- obejmuje klasy definiujące składowe elementy obiektu, w tym inte`rfejsy do łączenia składowych w ostateczną postać obiektu.
Budowniczy - Współdziałanie
- Klient tworzy Kierownika i konfiguruje go za pomocą odpowiedniego obiektu Budowniczy;
- w celu utworzenia części produktu, obiekt Kierownik wysyła powiadomienie do obiektu Budowniczy;
- obiekt Budowniczy obsługuje żądania obiektu Kierownik i dodaje części produktu;
- Klient pobiera produkt od obiektu Budowniczy.
Budowniczy - Konsekwencje
- Możliwość zróżnicowania wewnętrznych struktur klas. Do produkcji służy interfejs abstrakcyjny, jego zmiana wymaga jedynie zdefiniowania obiektu Budowniczy nowego rodzaju.
- Duża skalowalność - dodawanie nowych reprezentacji obiektów jest uproszczone.
- Odizolowanie reprezentacji wewnętrznej od kodu tworzenia produktu (proces produkcyjny niezależny od elementów z których składa się obiekt).
- Każdy obiekt KonkretnyBudowniczy zawiera cały kod potrzebny do tworzenia i składania produktów odkreślonego rodzaju.
- Większa kontrola nad procesem tworzenia. Generowanie krok po kroku pod kontrolą Kierownika. Dopiero na koniec Kierownik odbiera od Budowniczego gotowy obiekt.
- Nieumiejętne używanie wzorca może spowodować nieczytelność kodu (jeden produkt może być tworzony przez zbyt wielu budowniczych).
Budowniczy - Implementacja
Zwykle w implementacji znajduje się klasa abstrakcyjna Budowniczy obejmująca definicję operacji dla każdego komponentu, którego utworzenia może zażądać obiekt Kierownik. Domyślnie operacje te nie wykonują żadnych działań. W klasie KonkretnyBudowniczy przesłonięte są operacje komponentów, które klasa ta ma generować
Prosta Fabryka - nazwa
ang. simple factory
antywzorzec(?)
Prosta fabryka - Przeznaczenie
Często stosuje się prostą fabrykę, gdy chcemy wyodrębnić fragment odpowiedzialny za utworzenie konkretnego produktu do osobnej klasy
Prosta Fabryka - Struktura
- może być statyczna,
- będzie tylko jedna,
- podajemy jej typ obiektu, który ma stworzyć, a ona w środku ma switch case, które tworzą konkretne obiekty
Jako że łamie trochę SOLIDa często uważana za antywzorzec → kiedy chcemy dodać przypadek w wielu miejscach musimy robić zmiany (enum, switch case, klasa obiektu)
Metoda wytwórcza - nazwy
ang. factory method
pol. konstruktor wirtualny
ang. virtual constructor
Metoda wytwórcza - kategoria
klasowy,
konstrukcyjny
Metoda wytwórcza - Przeznaczenie
Określa interfejs do tworzenia obiektów, przy czym umożliwia podklasom wyznaczenie klasy danego obiektu. Metoda wytwórcza umożliwia klasom przekazanie procesu tworzenia egzemplarzy podklasom.
Metoda wytwórcza - Uzasadnienie
- W systemach/programach klasy abstrakcyjne służą do definiowania i podtrzymywania relacji między obiektami.
- Ponieważ określona podklasa klasy Document, której egzemplarz należy utworzyć, jest specyficzna dla aplikacji, w klasie Application nie można z góry ustalić rodzaju tej podklasy. Klasa Application potrafi jedynie określić, kiedy należy utworzyć nowy dokument, a nie jakiego rodzaju powinien on być. Stawia nas to przed dylematem — platforma musi tworzyć egzemplarze klas, ale ma informacje tylko o klasach abstrakcyjnych, których egzemplarzy wygenerować nie może.
- Rozwiązaniem jest zastosowanie wzorca Metoda wytwórcza. Pozwala on zakapsułkować informacje o tym, którą podklasę klasy Document należy utworzyć i zapisać te dane poza platformą.
Metoda wytwórcza - Warunki stosowania
- Kiedy w danej klasie nie można z góry ustalić klasy obiektów, które trzeba utworzyć.
- Jeśli programista chce, aby to podklasy danej klasy określały tworzone przez nią obiekty.
- Jeżeli klasy delegują zadania do jednej z kilku podklas pomocniczych, a programista chce zapisać w określonym miejscu informacje o tym, która z tych podklas jest delegatem.
Metoda wytwórcza - Elementy
• Produkt (Product):
- definiuje interfejs obiektów generowanych przez metodę wytwórczą.
• KonkretnyProdukt (ConcreteProduct):
- obejmuje implementację interfejsu klasy Produkt.
• Wytwórca (Creator):
- obejmuje deklarację metody wytwórczej zwracającej obiekty typu Produkt;
- w obiekcie Wytwórca można też zdefiniować implementację domyślną metody fabrycznej, zwracającą domyślny obiekt KonkretnyProdukt;
- może wywoływać metodę wytwórczą [np. stwórz()] w celu wygenerowania obiektu Produkt.
• KonkretnyWytwórca (ConcreteCreator):
- przesłania metodę wytwórczą, tak aby zwracała egzemplarz klasy KonkretnyProdukt.
Metoda wytwórcza - Współdziałanie
Klasa Kreator działa na podstawie założenia, że w jej podklasach zdefiniowana jest metoda wytwórcza zwracająca egzemplarz odpowiedniej klasy KonkretnyProdukt.