Design Patterns Flashcards
Co to jest wzorzec projektowy?
Wzorce projektowe to rozwiązania na poziomie projektu dla powtarzających się problemów, z którymi my, inżynierowie oprogramowania, często spotykamy się. To nie kod - powtarzam, ❌CODE. To jest jak opis, jak poradzić sobie z tymi problemami i zaprojektować rozwiązanie.
Korzystanie z tych wzorców jest uważane za dobrą praktykę, ponieważ projekt rozwiązania jest dość wypróbowany i przetestowany, co skutkuje wyższą czytelnością końcowego kodu. Wzorce projektowe są dość często tworzone i używane przez języki OOP, takie jak Java, w której zostanie napisana większość przykładów od tego momentu.
Rodzaje wzorców projektowych
Obecnie odkryto około 26 wzorów (nie sądzę, że uda mi się je wszystkie odtworzyć…).
Te 26 można podzielić na 3 typy:
- Kreacyjne: Wzorce te są przeznaczone do tworzenia klas. Mogą to być zarówno wzorce tworzenia klas, jak i wzorce obiektowo-rekreacyjne.
- Strukturalne: Wzorce te są projektowane z uwzględnieniem struktury i składu klasy. Głównym celem większości tych wzorców jest zwiększenie funkcjonalności danej klasy (klas), bez wprowadzania większych zmian w jej składzie.
- Behawioralne: Wzorce te są projektowane w zależności od tego, jak jedna klasa komunikuje się z innymi.
Typ 1: Kreacyjny - Wzorzec projektowy Singleton
Wzorzec Singleton jest wzorcem kreacyjnym, którego celem jest utworzenie tylko jednej instancji klasy i zapewnienie tylko jednego globalnego punktu dostępu do tego obiektu. Jednym z powszechnie używanych przykładów takiej klasy w Javie jest Calendar, gdzie nie można utworzyć instancji tej klasy. Klasa ta używa również własnej metody getInstance() do uzyskania obiektu, który ma być użyty.
Klasa używająca wzorca projektowego singleton będzie zawierała,
schemat klasy singleton
Schemat klasy singletonowej
Prywatną zmienną statyczną, przechowującą jedyną instancję klasy. Prywatny konstruktor, aby nie można było jej zainicjować nigdzie indziej. Publiczną metodę statyczną zwracającą pojedynczą instancję klasy.
Chętny bóbr
Tego typu instancja występuje podczas ładowania klasy, ponieważ instancja zmiennej występuje poza każdą metodą. Stanowi to poważną wadę, jeśli klasa ta nie jest w ogóle używana przez aplikację kliencką. Jeżeli klasa ta nie jest używana, można skorzystać z metody Lazy Instantiation.
Lazy Days
Zmienna statyczna jest początkowo deklarowana jako null i jest instancjonowana w metodzie getInstance() tylko wtedy, gdy - i tylko wtedy - zmienna instancji pozostaje null w czasie sprawdzania.
Rozwiązuje to jeden problem, ale inny nadal istnieje. Co się stanie, jeśli dwóch różnych klientów uzyska dostęp do klasy Singleton w tym samym czasie, z dokładnością do jednej milisekundy? Cóż, w tym samym czasie sprawdzą, czy instancja jest null, i stwierdzą, że tak, a więc utworzą dwie instancje klasy dla każdego żądania dwóch klientów. Aby to naprawić, należy zaimplementować bezpieczną instancję wątku.
Fabryka Abstrakcyjna
Umożliwia tworzenie rodzin powiązanych obiektów bez określania ich konkretnych klas.
Adapter
Umożliwia współpracę obiektów o niekompatybilnych interfejsach.
Budowniczy
Pozwala na konstruowanie złożonych obiektów krok po kroku. Wzorzec pozwala na tworzenie różnych typów i reprezentacji obiektu przy użyciu tego samego kodu konstrukcyjnego.
Most
Pozwala podzielić dużą klasę lub zestaw ściśle powiązanych klas na dwie oddzielne hierarchie - abstrakcji i implementacji - które mogą być rozwijane niezależnie od siebie.
Metoda fabryczna
Udostępnia interfejs do tworzenia obiektów w nadklasie, ale pozwala podklasom zmieniać typ obiektów, które będą tworzone.
Kompozyt
Umożliwia kompilowanie obiektów w struktury drzewiaste, a następnie pracę z tymi strukturami tak, jakby były pojedynczymi obiektami.
Prototyp
Umożliwia kopiowanie istniejących obiektów bez uzależniania kodu od ich klas.
Dekorator
Umożliwia dołączanie nowych zachowań do obiektów poprzez umieszczanie ich wewnątrz specjalnych obiektów opakowujących, które zawierają te zachowania.
Singleton
Umożliwia zapewnienie, że klasa ma tylko jedną instancję, a jednocześnie zapewnia globalny punkt dostępu do tej instancji.
Fasada
Zapewnia uproszczony interfejs do biblioteki, frameworka lub innego złożonego zestawu klas.