Singleton
Situace
V systému má existovat třída, která může mít nanejvýš jednu
globální instanci a zároveň centralizuje k této instanci přístup.
Problém
Teoreticky je možné vytvořit instanci libovolné třídy na libovolném
místě. Toto chování není žádoucí u třídy, která může mít instanci
jen jednu a navíc centrálně spravovanou.
Řešení
Skrytím konstruktoru zvolené třídy se omezí místa, na kterých je
možné její instance vytvářet. Dále se ve třídě vytvoří statická
proměnná obsahující globální sdílenou instanci dané třídy. Do této
proměnné se instance třídy může přiřadit hned, nebo až v případě
potřeby (princip lazy loading).
UML diagramy
Implementace
Následuje jednoduchý příklad implementace tohoto vzoru v programovacím jazyce Java.
Singleton
kód v jazyce Java - Zobrazit
-
/**
-
* Třída, která má globálně
nejvýše jednu instanci.
-
*
-
* @author Vojtěch
Hordějčuk
-
*/
-
public class
Singleton
-
{
-
/**
-
* jedinečná globální
instance třídy
-
*/
-
private static Singleton instance = null;
-
-
/**
-
* Vrátí jedinečnou
globální instanci této třídy. Pokud instance neexistuje,
-
* bude vytvořena. Aby byla
metoda bezpečná, je nutné přidat kvalifikátor
-
*
"synchronized".
-
*
-
* @return jedinečná
globální instance třídy
-
*/
-
public static Singleton getInstance()
-
{
-
if (Singleton.instance == null)
-
{
-
// globální instance
neexistuje, je třeba ji vytvořit
-
-
Singleton.instance = new Singleton();
-
}
-
-
return Singleton.instance;
-
}
-
-
/**
-
* Konstruktor nesmí být
veřejný, aby jej nebylo možné volat, a tak obcházet
-
* výchozí
mechanismus.
-
*/
-
private Singleton()
-
{
-
// ...
-
}
-
}
Test
kód v jazyce Java - Zobrazit
-
public static
void main(String[] args)
-
{
-
// získat globální instanci třídy
a vykonat akci
-
-
Singleton.getInstance().doSomething();
-
}
Reference