I. Wzorce kreacyjne 1. Singleton 2. Budowniczy 3. Prototyp 4. Fabryka 5. Fabryka abstrakcyjna II. Wzorce strukturalne 1. Adapter 2. Most 3. Kompozyt 4. Dekorator 5. Fasada 6. Pyłek 7. Pełnomocnik III. Wzorce czynnościowe 1. Łańcuch zobowiązań 2. Polecenie 3. Interpreter 4. Iterator 5. Mediator 6. Pamiątka 7. Obserwator 8. Stan 9. Strategia 10. Metoda szablonowa 11. Odwiedzający |
Singleton - wzorzec projektowy (design pattern) - java1. Cel:Wzorzec projektowy Singleton ma za zadanie dostarczyć tylko jedną instancje klasy. Zapewnia jeden globalny punkt dostępu do tej instancji. 2. Problem: Singleton używany jest na przykład gdy chcemy zapewnić kontrole dostępu do dzielonego zasobu takiego jak baza danych lub plik itp. 3. Rozwiązanie: Prywatny konstruktor który zapobiega użyciu słowa kluczowego new, dla instancji klasy. Stworzenie metody statycznej zwracającej stworzony tylko jeden obiekt. 4. Diagram klas klasy Singleton: 5. Implementacja: Mamy kilka rodzajów implementacji singleton-a. a) Jednowątkowy:
Aby temu zapobiec dodajemy na zmienną instance słowo kluczowe volatile - mówi ono: "Uważaj - bo może ona zmienić wartość nawet wtedy, gdy się nie spodziewasz!" to zapobiegnie że nie zostanie zauważona zmiana w jednym wątku gdy zmiana dokonuje się w drugim. Technicznie rzecz biorąc, zmienna będzie pobierana z pamięci komputera nie z cache-u procesora
Wydaje się najlepszym podejściem, ponieważ nie jest ładowana do pamięci do póki nie zostanie wywołana metoda statyczne getInstance();
h) Serializacja/deserializacja: wynikają z niej problemy z inną wersją instancji Klasa testowa
Więc jeżeli będziemy mieć zmienną value = 1 i zapiszemy do pliku, następnie zmienimy value = 2, następnie deserializujemy obiekt Singleton zapisany do pliku, to zmienna zapisana w pliku czyli value = 2 nie nadpisze wartości którą zmieniliśy w naszej klasie, czyli pomimo deserializacji value = 1, obiekt dalej będzie równy 2. i) Zapobieganie clone-owania:
java.lang.Runtime#getRuntime() - zastowowany SingletonEager: java.lang.System#getSecurityManager() - zastosowana metoda synchronizowana SingletonSynchMethod, ale wewnątrz innej metody. Zmienna ze słowem kluczowym volatile; java.awt.Desktop#getDesktop() - zastosowana metoda synchronizowana SingletonSynchMethod |
---|