Singleton to kreacyjny wzorzec projektowy gwarantujący istnienie tylko jednego obiektu danego rodzaju. Udostępnia też pojedynczy punkt dostępowy do takiego obiektu z dowolnego miejsca w programie.
Singleton charakteryzuje się prawie takimi samymi zaletami i wadami jak zmienne globalne i chociaż jest bardzo poręczny, to jednak psuje modularność kodu.
Nie można przenieść klasy zależnej od Singletona i użyć jej w innym kontekście bez równoczesnego przeniesienia tego drugiego. To ograniczenie zazwyczaj ujawnia się na etapie tworzenia testów jednostkowych.
Identyfikacja: Singleton można rozpoznać po statycznej metodzie kreacyjnej zwracającej jakiś obiekt którego instancja jest przechowywana w pamięci podręcznej.
Implementacja naiwna (jednowątkowa)
Łatwo jest zaimplementować wzorzec Singleton niechlujnie — wystarczy ukryć konstruktor i zaimplementować statyczną metodę kreacyjną.
Singleton.java: Singleton
DemoSingleThread.java: Kod klienta
OutputDemoSingleThread.txt: Wynik działania
Implementacja naiwna (wielowątkowa)
Ta sama klasa będzie działać nieprawidłowo w środowisku wielowątkowym — różne wątki mogą wywołać metodę kreacyjną w tym samym momencie, otrzymując wiele instancji klasy Singleton.
Singleton.java: Singleton
DemoMultiThread.java: Kod klienta
OutputDemoMultiThread.txt: Wynik działania
Singleton z bezpieczeństwem wątków i z lazy loading
Aby pozbyć się wyżej wymienionego problemu, trzeba zsynchronizować wątki w momencie pierwszego tworzenia obiektu Singleton.
Singleton.java: Singleton
DemoMultiThread.java: Kod klienta
OutputDemoMultiThread.txt: Wynik działania
Chcesz wiedzieć więcej?
Jest więcej specjalnych rodzajów wzorca Singleton w Javie i opisuje je poniższy artykuł: