Singleton

Technology
12 hours ago
8
4
2
Avatar
Author
Albert Flores

Singleton (česky jedináček nebo také unikát) je název pro návrhový vzor používaný při programování. Využijeme ho, když je potřeba, aby v celém programu existovala pouze jedna instance určité třídy. Návrhový vzor také poskytne globální přístupový bod k instanci. Singleton je také často využíván jako součást jiných návrhových vzorů jako jsou například Flyweight nebo Facade.

Účel

Nutnost existence jediné instance se objevuje například tam, kde potřebujeme, aby se nějaké objekty pohybovaly jen ve vymezeném prostředí - hráči fotbalu hrající na jednom hřišti. Třída definující hřiště vytváří svou instanci jako jedináček. +more Dalším příkladem mohou být dialogová okna nebo ovladače zařízení. Známým příkladem ze světa Windows je schránka, která může existovat jen jednou, aby se nám data získaná v jedné aplikaci neztratila někde po cestě do druhé aplikace.

Základní implementace

Implementace jedináčka mají společný soukromý konstruktor, který zaručí, že nedojde k vytvoření další instance. „Požadovaná instance se vytvoří uvnitř třídy a její odkaz se uloží do statického atributu. +more Jednotlivé varianty implementace se pak odlišují tím, kdy a jak se objekt konstruuje a jak jej mohou ti ostatní získat“.

Implementace v jazyce Java

public class Singleton {

private static Singleton instance;

//Vytvorime soukromy konstruktor private Singleton { }

//Metoda pro vytvoreni objektu jedinacek public static Singleton getInstance { //Je-li promenna instance null, tak se vytvori objekt if (instance == null) { instance = new Singleton; } //Vratime jedinacka return instance; }

//Pouziti public static void main(String[] args) { Singleton objekt = Singleton.getInstance; } }

Ukázka kódu z Java - návrhový vzor Singleton

Druhá možnost implementace vzoru je následující:

public class Singleton {

private static final Singleton instance = new Singleton;

private Singleton { }

public static Singleton getInstance { return instance; }

// Použití je stejné public static void main(String[] args) { Singleton objekt = Singleton.getInstance; } }

V tomto případě nemusíme zjišťovat, zda je proměnná inicializovaná - kód je přehlednější a vláknově bezpečný.

Implementace v jazyce C# (thread safe)

class Singleton {

// okamzita inicializace instance pri prvni pouziti objektu. private static Singleton instance = new Singleton;

static Singleton { } //Privatni konstruktor private Singleton { }

//Staticka property (vlastnost) zajistujici vraceni instance public static Singleton Instance { get { return instance; }} }

class Program { //Pouziti public static void Main { var s = Singleton.Instance; } }

Implementace v jazyce C++

class Singleton {

private: static Singleton *instance;

public: static Singleton *GetInstance { if (instance == NULL) { // Ve standardu C++11 a vyšších lze použít místo NULL nullptr. instance = new Singleton; } return instance; }

}

Implementace v jazyce PHP

class Singleton { private static $instance = NULL;

private function __construct { }

public static function getInstance { if (self::$instance == NULL) { self::$instance = new self; } return self::$instance; }

public function __clone { trigger_error('Clone is not allowed.', E_USER_ERROR); }

public function __wakeup { trigger_error('Unserializing is not allowed.', E_USER_ERROR); } }

Ukázka kódu v jazyce PHP

Nevýhody

Při využívání vícevláknových aplikací se může stát, že první vlákno požádá o vytvoření jedináčka. Mikroprocesor přepne na druhé vlákno, kde ještě není jedináček vytvořen a je spuštěn proces tvorby jedináčka. +more Poté je přepnuto na první vlákno, kde byl jedináček započat a je dokončen. Už není jedináček, ale má sourozence. Tomu by se dalo vyhnout synchronizováním tovární metody. Synchronizovat celou metodu je poměrně drahá operace (synchronizovaná metoda se volá vždy při získání instance). Řešení můžeme optimalizovat (v případě, že používáme Javu 5 a vyšší) pomocí definování odkazu na jedináčka jako volatile a synchronizováním bloku kódu, starající se tvorbu jedináčka.

public class Singleton { private static volatile Singleton instance = null;

public static Singleton getInstance { if (instance

null) synchronized (Singleton.class) { if (instance

null) instance = new Singleton; } return instance; } }

Řešení problému vícevláknových aplikací v Javě 5

Další problém nastává u serializovatelnosti jedináčka. Kdybychom chtěli načítat jedináčka uloženého ze streamu, například souboru, musíme zkontrolovat, jestli již nějaký takový jedináček neexistuje (Java poskytuje metodu, kterou je tato funkcionalita podpořena, jedná se o readSolve, tato metoda vrací odkaz na aktuálního (původního) jedináčka, ale umožňuje ho například doplnit o novinky jedináčka ze streamu).

Reference

Externí odkazy

[url=https://web. archive. +moreorg/web/20090304005155/http://objekty. vse. cz/Objekty/Vzory-Singleton]Návrhový vzor singleton[/url] * [url=http://interval. cz/clanky/pouzivame-navrhove-vzory-v-net-singleton/]Používáme návrhové vzory v . NET - Singleton[/url] * [url=http://phpfashion. com/je-singleton-zlo]Je singleton zlo. [/url] * [url=https://web. archive. org/web/20100703091015/http://www. misantrop. info/716382-je-singleton-mrtvy-ale-kdepak. php]Je singleton mrtvý. Ale kdepak[/url] * [url=http://msdn. microsoft. com/en-us/library/ms998558. aspx]Vícevláknový singleton na msdn. com[/url] * [url=http://giorgiosironi. blogspot. com/2009/11/how-to-eliminate-singletons. html]Jak eliminovat singletony[/url] * [url=http://www. garyrobinson. net/singletonmixin. py]Soubor s thread-safe singletonem v jazyce Python[/url] * [url=https://web. archive. org/web/20091215084348/http://www. python. org/workshops/1997-10/proceedings/savikko. html]Vespe Savikko: Design Patterns in Python [/url] * [url=http://c2. com/cgi/wiki. PythonSingleton]Python Singleton[/url] * [url=https://web. archive. org/web/20111102114615/http://php. net/manual/en/language. oop5. patterns. php]PHP5 OOP Patterns[/url].

Kategorie:Návrhové vzory

5 min read
Share this post:
Like it 8

Leave a Comment

Please, enter your name.
Please, provide a valid email address.
Please, enter your comment.
Enjoy this post? Join Cesko.wiki
Don’t forget to share it
Top