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.
Waga musza
Umożliwia zmieszczenie większej liczby obiektów w dostępnej ilości pamięci RAM poprzez współdzielenie wspólnych części stanu pomiędzy wieloma obiektami, zamiast przechowywania wszystkich danych w każdym z nich.
Proxy
Umożliwia zapewnienie zastępstwa lub zastępczego miejsca dla innego obiektu. Funkcja proxy kontroluje dostęp do oryginalnego obiektu, umożliwiając wykonywanie działań przed lub po dotarciu żądania do oryginalnego obiektu.
Łańcuch Odpowiedzialności
Umożliwia przekazywanie żądań wzdłuż łańcucha handlerów. Po otrzymaniu żądania każdy z handlerów decyduje, czy przetworzyć żądanie, czy przekazać je do następnego w łańcuchu.
Polecenie
Przekształca żądanie w samodzielny obiekt, który zawiera wszystkie informacje o żądaniu. Ta transformacja pozwala przekazywać żądania jako argumenty metod, opóźniać lub kolejkować wykonanie żądania oraz obsługiwać operacje, których nie można cofnąć.
Iterator
Umożliwia przeglądanie elementów kolekcji bez ujawniania jej podstawowej reprezentacji (listy, stosu, drzewa itp.).
Mediator
Pozwala ograniczyć chaotyczne zależności między obiektami. Wzorzec ten ogranicza bezpośrednią komunikację między obiektami i zmusza je do współpracy wyłącznie za pośrednictwem obiektu pośredniczącego.
Memento
Umożliwia zapisywanie i przywracanie poprzedniego stanu obiektu bez ujawniania szczegółów jego implementacji.
Obserwator
Umożliwia zdefiniowanie mechanizmu subskrypcji w celu powiadamiania wielu obiektów o wszelkich zdarzeniach dotyczących obserwowanego przez nie obiektu.
Państwo
Umożliwia zmianę zachowania obiektu, gdy zmienia się jego stan wewnętrzny. Wygląda to tak, jakby obiekt zmienił swoją klasę.
Strategia
Umożliwia zdefiniowanie rodziny algorytmów, umieszczenie każdego z nich w osobnej klasie i uczynienie ich obiektów wymiennymi.
Metoda szablonu
Definiuje szkielet algorytmu w nadklasie, ale pozwala podklasom nadpisywać poszczególne kroki algorytmu bez zmiany jego struktury.
Odwiedzający
Umożliwia oddzielenie algorytmów od obiektów, na których działają.