Wzorce projektowe, część I
Przegląd zagadnień
Zajęcia poruszą problem wzorców projektowych - bardzo ważnego elementu programowania obiektowego.
Omówione zostanie pojęcie wzorców projektowych, a także przyczyny ich używania.
Na zajęciach pojawi się również krótki podział wzorców projektowych na konstrukcyjne, strukturalne i czynnościowe.
W drugiej części Laboratorium omówione zostaną wzorce konstrukcyjne na przykładzie Fabryki, Budowniczego i Singletonu.
Zajęcia zakończy napisanie programu wykorzystującego zdobytą wiedzę.
Wzorce projektowe (1)
Trudno powiedzieć, kiedy pojawiły się pierwsze wzorce projektowe w programowaniu, jest jednak niezaprzeczalnym faktem, że od czasu ukazania się w 1995 roku książki „Design Patterns” autorstwa Gammy, Helma, Johnsona i Vlissidesa nastąpił wzrost zainteresowania tą tematyką.
Wzorce projektowe są od tego czasu integralną częścią inżynierii oprogramowania jako abstrakcyjny opis zależności pomiędzy klasami.
Dzięki wykorzystaniu wzorców projektowych możliwa była standaryzacja kodu, wskutek czego stał się on bardziej czytelny, efektywniejszy i mniej zawodny.
Wzorce projektowe (2)
Jedna z podstawowych klasyfikacji wzorców projektowych wyróżnia trzy istotne grupy:
wzorce konstrukcyjne służące do pozyskiwania obiektów zamiast bezpośredniego tworzenia instancji klas (np. Fabryka, Budowniczy, Singleton)
wzorce strukturalne, pomagające łączyć obiekty w większe struktury (np. Adapter, Fasada)
wzorce czynnościowe, które definiują komunikację pomiędzy obiektami oraz kontrolują przepływ danych w złożonej aplikacji (np. Obserwator)
Fabryka (1)
Wzorzec fabryki doskonale sprawdza się w sytuacjach, w których mamy konieczność dokonania wyboru pomiędzy instancjami klas w zależności od dostarczanych danych.
Wszystkie klasy mają w nim wspólnego przodka i wspólne metody, jednak typ danych determinuje, w jaki sposób wykonają swoje zadania.
W efekcie każda z klas działa w specyficzny dla siebie sposób.
Fabryka (2)
W powyższym przykładzie w zależności od płci osoby, pojawia się na ekranie stosowne powitanie.
Wadą metody jest konieczność przygotowania przez klienta podklasy kreatora, żeby uzyskać konkretny efekt.
Budowniczy (1)
Wzorzec Budowniczego umożliwia rozdzielenie skomplikowanej struktury klasy od jej reprezentacji.
Jego podstawowymi elementami są interfejs budowniczego, sam budowniczy, kierownik wykorzystujący interfejs budowniczego do konstrukcji produktu oraz konstruowany produkt.
Budowniczy (2)
Powyższy przykład ilustruje wzorzec projektowy budowniczego.
Końcowy efekt - klasa ZestawNarciarza jest powstaje przez zadziałanie nadrzędnego procesu przez interfejs Produkt.
Rolę konkretnego budowniczego w przykładzie pełnie klasa Zjazdowe:Narty.
Singleton (1)
Czasami zachodzi potrzeba, aby pewna klasa miała co najwyżej jedną instancję. Może tak się zdarzyć, gdy klasa wymaga dużej ilości zasobów do instancjonowania, lub obsługuje połączenie z bazą danych czy sprzęt. Można wówczas skorzystać z wzorca Singleton.
Singleton może mieć najwyżej jedną instancję. Przyjrzyjmy się budowie tej klasy. Konstruktor singletonu jest prywatny - nie można go więc wywoływać dowolnie spoza klasy. Instancję można utworzyć statyczną metodą getInstance() (oczywiście nazwę można zmienić). Na potrzeby tej metody jest jeszcze statyczna składowa - zmienna obiektowa S klasy singleton. Gdy zmienna ta jest pusta, metoda getInstance() tworzy instancję singletonu i umieszcza referencję do niej w zmiennej S, a następnie zwraca tę referencję. Jeśli zmienna S przechowuje już referencje, metoda tylko ją zwraca.
Gdy zatem pierwszy raz definiujemy zmienną obiektową klasy Singleton, metoda getInstance() tworzy instancję. Za drugim razem dostaniemy instancję do stworzonego już wcześniej obiektu.
Singleton (2)
Zobaczmy na przykładową klasę Baza, która jest singletonem. Struktura klasy jest podobna jak na poprzednim slajdzie, dodana została jedna metoda i komunikaty wyświetlane w konsoli.
Pierwsze wywołanie połączenia z bazą spowoduje utworzenie instancji klasy Baza. Za drugim razem otrzymamy komunikat, że baza już istnieje, a wszystkie operacje będą dotyczyły instancji utworzonej za pierwszym razem.
Podsumowanie
Wzorce konstrukcyjne umożliwiają rezygnację z bezpośredniego tworzenia instancji klas na rzecz pozyskiwania obiektów.
Pytania sprawdzające
Pytania sprawdzające:
Wymień i opisz podstawowe typy wzorców projektowych.
Omów wzorzec Budowniczego.
Jak działa wzorzec Fabryka?
Omów wzorzec Singleton
Laboratorium
Zaimplementuj wzorzec Fabryki w programie, który zajmie się obsługi różnych nośników danych.
Napisz program, który na bazie wzorca Budowniczego przygotuje w salonie samochodowym auto z wyposażeniem dla konkretnego klienta.
Wymyśl sposób zaimplementowania wzorca Singleton.
L
L