Je tomu již několik měsíců, co jsem studoval singletony, protože jsem je potřeboval do aplikace pro 3 základní funkce programu. Měl jsem 3 třídy pro zobrazení, čtení z klávesnice a zápis do logu (na HDD). Tyto třídy jsem potřeboval využívat prakticky za chodu celého programu. Problém objektů je ale ten, že se musí kontruovat, pak voláte metody a na konci dojde k destrukci. To třeba u logu nepřipadá v úvahu, vzhledem k faktu, že nová konstrukce mi vytvářela nový soubor (přepsala starý log, vytvořený jinou funkcí).. ..a když se funkce(metody) překrývaly (z jedné se volala další), tak docházelo k pádům aplikace kvůli konfliktům na úložišti, atd.
Řešením byl singleton. Ale byl to problém. Těch implementací je několik a některé jsou složitější než se může na první pohled zdát. A teď se dostáváme k jádru věci. Narazil jsem na implementaci singletonu Scotta Mayerse, která je (dle mého názoru) geniální. Posuďte sami (všeobecný příklad):
- Kód: Vybrat vše
class Singleton
{
public:
static Singleton &instance()
{
static Singleton inst; // 2. inicializace statického objektu - pouze při prvním průchodu - registrace atexit
return inst; // 4. návrat zkonstruovaného objektu
}
private:
Singleton() { } // 3. konstruktor objektu
Singleton(const Singleton&);
Singleton& operator=(const Singleton&);
~Singleton() { } // 6. destruktor objektu
};
int main(int argc, char** argv)
{
Singleton& s = Singleton::instance(); // 1. zavolá se metoda
} // 5. konec programu - destrukce statických proměnných
V praxi to může vypadat například takto (můj program):
http://paste.wlezley.eu/index.php/view/42930715
http://paste.wlezley.eu/index.php/view/36455688
http://paste.wlezley.eu/index.php/view/50019155
Ty definice pod každou z těchto tříd (sCon, sLog, sKey) slouží pouze ke zkrácení zápisu v samotném programu.
Nevíte jak singletony fungují ani co to je? Doporučuji:
(CZ) http://cs.wikipedia.org/wiki/Singleton
(EN) http://en.wikipedia.org/wiki/Singleton_pattern