Singleton: Porovnání verzí

Smazaný obsah Přidaný obsah
EmausBot (diskuse | příspěvky)
m r2.6.4) (robot změnil: tr:Tekil kalıp
Mstarman (diskuse | příspěvky)
Překopání články, grafické úpravy
Řádek 1:
'''Singleton''' (česky ''jedináček'' nebo také ''unikát'') je název pro techniku[[návrhový vzor]], kterépoužívaný se využívá vpři [[programování]]. Singleton,Využijeme českyho ''jedináček''při nebořešení ''unikát''problému, představujekdy řešeníje problémupotřeba, kdyaby v celém [[počítačový program|programu]] má běžetběžela pouze jedinájedna [[Instance třídy|instance]] nějaké [[Třída (programování)|třídy]]. (pouzeTento 1návrhový [[Instancevzor třídy|objekt]]zabezpečí, danéže třídy).třída Tohobude semít využívájedinou napříkladinstanci proa sdíleníposkytne informacík a vlastnostíglobální mezipřístupový objekty.bod<ref name="refone">{{Citace monografie
| autor = Erich Gamma, Richard Helm, Ralph Johnson, John M. Vlissides
 
| odkaz na autora =
GOF: Ensure a class only has one instance, and provide a global point of access to it. – Zabezpečí, že třída bude mít jedinou instanci a poskytne k ní globální přístupový bod<ref>Design Patterns: Elements of Reusable Object-Oriented Software, Addison-Wesley Professional; illustrated edition edition (November 10, 1994), ISBN 0-201-63361-2</ref>
| titul = Design Patterns: Elements of Reusable Object-Oriented Software
| vydavatel = Addison-Wesley Professional
| místo =
| rok = 1995
| isbn = 0-201-63361-2
| kapitola =
| strany =
| poznámka =
| jazyk = anglicky
}}</ref>. 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řebujipotř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í dvorekhřiště vytváří svou instanci jako jedináček. „DalšímDalším příkladem jsoumohou být dialogová okna, nebo ovladače zařízení<ref “[1]name="refone"></ref>. 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. Jedináček se dále používá při implementaci některých dalších návrhových vzorů.
 
==Základní implementace==
Proč není vhodné místo jedináčka používat přímo jeho vlastní třídu? Protože objekt může implementovat nějaké rozhraní, odkaz na něj mohu předat jako parametr a na poslední chvíli mohu rozhodnout, čí bude objekt potomek.
 
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. Jednotlivé varianty implementace se pak odlišují tím, kdy a jak se objekt konstruuje a jak jej mohou ti ostatní získat“<ref name="reftwo">{{Citace monografie
Dalším problém tkví přímo v JVM – Java má na starost zavádění a inicializaci tříd a pokud bude takových tříd více propojeno, není zaručeno, že inicializace proběhne ve správném pořadí. Mohou tak vznikat těžko odhalitelné chyby. Inicializaci lze v případě použití instancí lépe ovlivňovat.
| autor = Rudolf Pecinovský
| odkaz na autora =
| titul = Návrhové vzory
| vydavatel = Computer Press
| místo =
| rok = 2007
| isbn = 978-80-251-1582-4
| kapitola =
| strany =
| poznámka =
| jazyk = česky
}}</ref>.
 
=== Implementace v jazyce [[Java]] ===
==Základní implementace==
<source lang=java>
public class Singleton {
 
private static Singleton instance;
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. Jednotlivé varianty implementace se pak odlišují tím, kdy a jak se objekt konstruuje a jak jej mohou ti ostatní získat“<ref>Rudolf Pecinovský: Návrhové vzory , Computer Press 2007, ISBN: 978-80-251-1582-4</ref>. Obvykle je dobré konstruktor označit jako finální, aby třída nemohla mít potomky. „Se soukromým konstruktorem to nejde a bude vše na první pohled videt v signatuře třídy.“[1]
 
//Vytvorime soukromy konstruktor
Ukázka Java
private Singleton() { }
<source lang=java>
public class Singleton {
//Vytvorime staticky objekt ktery ma hodnotu null
//Metoda pro vytvoreni objektu jedinacek
private static Singleton instance;
public static Singleton getInstance() {
//Vytvorime soukromy konstruktor
//Jeli je promenna instance null, tak se vytvori objekt
if (instance == null) {
instance = new Singleton();
}
//Vratime jedinacka
return instance;
}
public void pozdrav() {
private Singleton(){}
System.out.print("Ahoj ja jsem jedinacek.");
//metoda pro vytvoreni objektu jedinacek
}
//Pouziti
public static Singleton getInstance(){
public static void main(String[] args) {
//Jestliže je promenna instance rovna null, tak se vytvori objekt
Singleton objekt = Singleton.getInstance();
if (instance == null) {
instance = new Singletonobjekt.pozdrav();
}
//navrátíme objekt
return instance;
}
public void pozdrav(){
System.out.print(”Ahoj ja jsem text”);
}
public static void main(String[] args) {
Singleton objekt=Singleton.getInstance();
objekt.pozdrav();
}}
</source>
Ukázka kódu z ''Java - návrhový vzor Singleton''<ref>{{Citace elektronické monografie
Ukázka kódu z http://programovani.blog.zive.cz/2009/08/java-navrhovy-vzor-singleton/
| příjmení = Hrebenar
| jméno = Jiří
| odkaz na autora =
| titul =
| url = http://programovani.blog.zive.cz/2009/08/java-navrhovy-vzor-singleton/
| datum vydání = 28. 8. 2009
| datum aktualizace =
| datum přístupu =
| vydavatel =
| místo =
| jazyk = český
}}</ref>
 
=== Implementace v jazyce [[Python]] ===
<source lang=python>
Ukázka Python
## Singleton class
#
Řádek 114 ⟶ 146:
</source>
 
Ukázka kódu z How to make singleton in Python <ref>[http://wiki.forum.nokia.com/index.php/How_to_make_a_singleton_in_Python How to make a singleton in Python], 29. 11. 2009,</ref>
 
==Implementace singletonu v jazyce [[Csharp|C#]]==
Příklad pro [[Vlákno (program)|jednovláknový program]] (pro vícevláknové programy je nutno řešit jinak).
 
=== Implementace v jazyce [[Csharp|C#]] ===
<source lang=csharp>
class Singleton {
 
private static Singleton instance;
 
/**
//Privatni konstruktor
* Konstruktor je privátní, aby nikdo nemohl
* vytvářet nové instance této třídy
*/
private Singleton() { }
 
//Staticka property (vlastnost) zajistujici vytvoreni instance
/**
* Veřejná statická property (vlastnost), která
* zajišťuje vytvoření jedné instance této třídy
*/
public static Singleton Instance {
get {
//Jeli je promenna instance null, tak se vytvori objekt
/**
* Není-li v programu ani jedna instance této třídy
*/
if (instance == null) {
/**
* Vytvoř novou a jedinou instanci této třídy
*/
instance = new Singleton();
}
/**/Vratime jedinacka
* Vrat objekt Singleton
*/
return instance;
}
Řádek 152 ⟶ 171:
 
class Program {
/**/Pouziti
* Main
*/
public static void Main() {
Singleton s = Singleton.Instance;
Řádek 161 ⟶ 178:
</source>
 
=== Implementace v jazyce [[C++]] ===
'''Ukázka v C++'''
 
<source lang=cpp>
 
class Singleton {
private:
static Singleton *instance;
public:
private:
static Singleton *instance;GetInstance() {
if (instance == NULL) {
instance = new Singleton();
public:
}
static Singleton *GetInstance()
return instance;
{
}
if (instance == NULL) {
instance = new Singleton();
}
return instance;
}
}
 
</source>
 
==Nevýhody==
==Vícevláknové aplikace==
 
Při využívání [[Vlákno (program)|vícevláknových]] aplikací se může stát, že první vlákno požádá o vytvoření jedináčka. [[Procesor]] přepne na druhé vlákno, kde ještě není jedináček vytvořen a je spuštěn proces tvorby jedináčka. Poté je přepnuto na první vlákno, kde byl jedináček započat a je dokončen. Bohužel už není jedináček, ale je to dvojče. Tomu by se dalo vyhnout [[Synchronizace|synchronizováním]] tovární [[metoda|metody]], což je ale poměrně drahá operace. Při(při používání Javy 5 není nutné synchronizovat celou tovární metodu a jedináček se definuje jako volatile). V mladších verzích Javy sice tato funkčnost byla implementována, ale ne zcela bezchybně.
 
Další problém nastává u [[Serializace|serializovatelnosti]] jedináčka. Kdybychom chtěli načítat jedináčka uloženého ze [[stream]]u, 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).
==Serializovatelnost==
 
==Reference==
Další problém nastává u serializovatelnosti, kdybych chtěl načítat jedináčka uloženého z nějakého streamu, třeba souboru. Musím zkontrolovat, jestli již nějaký takový jedináček neexistuje. Java poskytuje metodu, kterou je tato funkcionalita podpořena, jedná se o
<references/>
 
Object readSolve() throws ObjectStreamException
 
Ta vrací odkaz na aktuálního (původního) jedináčka, ale umožňuje ho například doplnit o novinky jedináčka ze streamu
 
Další problém se vyskytuje u J2EE, kde existuje několik pararelních class loaderů. Je vždy nutné uvažovat nad tím, aby jimi nebyl jedináček zaveden vícekrát.
 
==Shrnutí==
 
„Na závěr je potřeba ještě dodat, že Singleton patří do kategorie návrhových vzorů tvořících, které řeší problematiku tvorby objektů, což je patrné již z názvu kategorie, a je také často využíván jako součást jiných návrhových vzorů jako jsou například Flyweight nebo Facade.“
 
==Související články==
* [[Návrhový vzor|Návrhové vzory]]
* [[Objektově orientované programování]]
* [[Programování]]
 
==Externí odkazy==
 
* {{cs}} [http://objekty.vse.cz/Objekty/Vzory-Singleton Návrhový vzor singleton]
* {{cs}} [http://interval.cz/clanky/pouzivame-navrhove-vzory-v-net-singleton/ Používáme návrhové vzory v .NET – Singleton]
* {{cs}} [http://phpfashion.com/je-singleton-zlo Je singleton zlo?]
* {{cs}} [http://www.misantrop.info/716382-je-singleton-mrtvy-ale-kdepak.php Je singleton mrtvý? Ale kdepak]
* {{en}} [http://msdn.microsoft.com/en-us/library/ms998558.aspx Vícevláknový singleton na msdn.com]
* {{en}} [http://giorgiosironi.blogspot.com/2009/11/how-to-eliminate-singletons.html Jak eliminovat singletony]
* [http://objekty.vse.cz/Objekty/Vzory-Singleton Návrhový vzor singleton]
* {{en}} [http://www.garyrobinson.net/singletonmixin.py Soubor s thread-safe singletonem v jazyce Python]
* [http://ulita.ms.mff.cuni.cz/pub/predn/PRG024/01-Singleton.ppt Prezentace Singleton]
* {{en}} [http://giorgiosironi.blogspot.com/2009/11/how-to-eliminate-singletons.html How to eliminate singletons,13.11.2009]
* {{en}} [http://www.garyrobinson.net/singletonmixin.py Soubor s thread-safe pythoním singletonen ]
* [http://interval.cz/clanky/pouzivame-navrhove-vzory-v-net-singleton/ Zdeněk Drlík:Používáme návrhové vzory v .NET – Singleton, 25. 03. 2005]
* [http://www.misantrop.info/716382-je-singleton-mrtvy-ale-kdepak.php Je singleton mrtvý? Ale kdepak. 23.08.2008 ]
* [http://phpfashion.com/je-singleton-zlo Je singleton zlo? 21. 8. 2008]
* {{en}} [http://www.python.org/workshops/1997-10/proceedings/savikko.html Vespe Savikko: Design Patterns in Python ]
* {{en}} [http://c2.com/cgi/wiki?PythonSingleton: Python Singleton]
* {{en}} [http://code.activestate.com/recipes/52558/ Jürgen Hermann: : Recipe 52558: The Singleton Pattern implemented with Python 5.4. 2001]
* [http://widle.cz/navrhove-vzory/navrhovy-vzor-singleton/ Radi: Návrhový vzor – Singleton 1.1.2009]
 
===References===
<references/>
 
[[Kategorie:Návrhové vzory]]