A singleton minta az egyik egyszerűbb tervezési minta. A singleton tervezési mintát használó osztálynak egyetlen példánya van, amelyet önállóan kezel. Ez az osztály megakadályozza, hogy bármely más osztály példányt hozzon létre belőle.
Az egytagú osztály egyetlen globális hozzáférési pontot is biztosít az általa létrehozott példányhoz. Tehát minden osztálynak, amely egy szimpla osztály példányát akarja, az egyetlen hozzáférési pontján keresztül kell elérnie.
A Java kiváló objektumorientált programozási támogatása megkönnyíti a singleton tervezési minta használatát.
A Singleton Pattern megvalósítása Java használatával
Számos módja van a singleton minta megvalósításának Java nyelven; a buzgó és lusta megközelítések gyakori változatok. Ezen megközelítések mindegyikének megvannak a maga előnyei és hátrányai. Ezért az alkalmazott módszernek az alkalmazás működésétől kell függnie.
A buzgó megközelítés
A singleton minta eager megközelítéssel való megvalósítása azt jelenti, hogy az osztály új példányt hoz létre önmagából, amikor betöltődik.
nyilvánososztályEagerSingleton{
magánstatikus EagerSingleton példány = új EagerSingleton();magánEagerSingleton(){}
nyilvánosstatikus EagerSingleton getInstance(){
Visszatérés példa;
}
}
A EagerSingletonJava osztály betöltéskor létrehoz egy új példányt önmagából. Ezt a példányt a privát statikushoz rendeli példány változó, amely csak a singleton osztályon belül érhető el. A példányváltozóhoz való külső hozzáférés egyetlen pontja a getInstance() módszer. Ez a metódus az osztály korábban létrehozott példányát adja vissza.
Ez a megközelítés nagyszerű, mivel megakadályozza a többszálú problémát, ami az egyik legnagyobb kihívás a singleton minta számára. Úgy oldja meg a többszálú problémát, hogy létrehoz egy új példányt önmagának, mielőtt bármely új szál hozzáférne a példányváltozójához. Ez garantálja, hogy minden szál csak ugyanahhoz a példányhoz férhet hozzá.
A lelkes megközelítés azonban csak akkor praktikus, ha az alkalmazás a singleton osztály egy példányát fogja használni, amikor elindul. Ellenkező esetben azelőtt hoz létre egy objektumot, hogy az alkalmazásnak szüksége lenne rá, és szükségtelenül használná fel az erőforrásokat.
A lusta megközelítés
A lusta megközelítés a megoldás a lelkes megközelítés problémájára. Lehetővé teszi, hogy új példányt hozzon létre egy szimpla osztályból csak akkor, ha a programnak szüksége van rá.
nyilvánososztályLazySingleton{
magánillóstatikus LazySingleton példány;magánLazySingleton(){}
nyilvánosstatikus LazySingleton getInstance(){
ha (példány == nulla) {
szinkronizálva (LazySingleton.osztály) {
ha (példány == nulla) {
példány = új LazySingleton();
}
}
}
Visszatérés példa;
}
}
A lusta megközelítés megoldja a többszálú problémát a szinkronizálva kulcsszó. Ez megakadályozza, hogy két szál egyszerre férhessen hozzá a példányváltozóhoz. A szinkronizálás azonban drága, így az alkalmazás csak egyszer használja, amikor először hívja meg a getInstance(t).
Mikor kell használni a Singleton-mintát?
A Singleton minta sok esetben hasznos párbeszédpanelek létrehozásához, beállításjegyzék-beállítások kezeléséhez vagy szálkészletek kezeléséhez.
Az egyszemélyes minta másik gyakori felhasználása egy központi osztály létrehozása, amely kezeli az adatbázis-kapcsolatokat.