Singleton vzor patrí medzi jednoduchšie dizajnové vzory. Trieda, ktorá používa vzor návrhu singleton, má jedinú inštanciu, ktorú spravuje sama. Táto trieda zabraňuje akejkoľvek inej triede vytvoriť jej inštanciu.
Trieda singleton tiež poskytuje jeden globálny prístupový bod k inštancii, ktorú vytvára. Takže každá trieda, ktorá chce inštanciu singletonovej triedy, potrebuje k nej pristupovať cez svoj jediný prístupový bod.
Vynikajúca podpora objektovo orientovaného programovania v jazyku Java uľahčuje používanie vzoru singleton.
Implementácia vzoru Singleton pomocou Java
Existuje mnoho spôsobov, ako implementovať vzor singleton v Jave; dychtivé a lenivé prístupy sú bežné variácie. Každý z týchto prístupov má svoje výhody a nevýhody. Metóda, ktorú sa rozhodnete použiť, by preto mala závisieť od toho, ako bude vaša aplikácia fungovať.
Dychtivý prístup
Implementácia vzoru singleton s dychtivým prístupom znamená, že trieda pri načítaní vytvorí novú inštanciu seba samej.
verejnostitriedaEagerSingleton{
súkromnéstatické Inštancia EagerSingleton = Nový EagerSingleton();súkromnéEagerSingleton(){}
verejnostistatické EagerSingleton getInstance(){
vrátiť príklad;
}
}
The EagerSingletontriedy Java pri načítaní vytvorí novú inštanciu seba samého. Túto inštanciu priradí k súkromnej statike premenná inštancie, ktorá je dostupná len v rámci triedy singleton. Jediným bodom externého prístupu k premennej inštancie je cez getInstance() metóda. Táto metóda vráti predtým vytvorenú inštanciu triedy.
Tento prístup je skvelý, pretože zabraňuje multithreading problém, ktorý je jednou z najväčších výziev singletonového vzoru. Rieši problém s viacerými vláknami vytvorením novej inštancie seba samého predtým, ako akékoľvek nové vlákno získa prístup k svojej premennej inštancie. To zaručuje, že každé vlákno bude mať prístup len k tej istej inštancii.
Dychtivý prístup je však praktický iba vtedy, ak vaša aplikácia bude pri spustení používať inštanciu triedy singleton. V opačnom prípade vytvoríte objekt skôr, ako ho vaša aplikácia potrebuje, pričom zbytočne spotrebujete zdroje.
Lenivý prístup
Lenivý prístup je riešením problému dychtivého prístupu. Umožňuje vám vytvoriť novú inštanciu triedy singleton iba vtedy, keď to váš program potrebuje.
verejnostitriedaLazySingleton{
súkromnénestálystatické inštancia LazySingleton;súkromnéLazySingleton(){}
verejnostistatické LazySingleton getInstance(){
ak (napríklad == nulový) {
synchronizované (LazySingleton.trieda) {
ak (napríklad == nulový) {
inštancia = Nový LazySingleton();
}
}
}
vrátiť príklad;
}
}
Lenivý prístup rieši problém s viacerými vláknami pomocou synchronizované kľúčové slovo. To bráni dvom vláknam získať prístup k premennej inštancie súčasne. Synchronizovaný je však drahý, takže ho aplikácia použije iba raz, keď prvýkrát zavolá getInstance().
Kedy použiť vzor Singleton
Vzor Singleton je užitočný v mnohých scenároch na vytváranie dialógových okien, spracovanie nastavení databázy Registry alebo správu fondov vlákien.
Ďalším bežným použitím vzoru singleton je vytvorenie centrálnej triedy, ktorá spravuje databázové pripojenia.