Návrhový vzor Singleton (GOF)

Popis a ukázka jednoduché implementace v C#

Co je to návrhový vzor?

Návrhový vzor (anglicky design pattern) v softwarovém inženýrství představuje obecné řešení problému, které se využívá při návrhu počítačových programů. viz wiki Návrhový vzor by se dal popsat jako "best practise" pro konkrétní řešení.

GOF (Gang of four)

Základním kamenem pro návrhové vzory se stala kniha Design Patterns: Elements of Reusable Object-Oriented Software, jejímiž autory jsou Erich Gamma, Richard Helm, Ralph Johnson a John Vlissides také známí jako Gang of Four.

Singleton

Je způsob jak zajistit abychom měli v aplikaci pouze jednu instanci dané třídy. Tento vzor je z hlediska použití sporný (jako způsob předávání závislostí je nedoporučovaný), proto si o něm přečtěte více, než ho začnete používat.

Základní rysy Singletonu

Privátní konstruktor - aby nebylo možné vytvořit instanci z venku. Privátní statická vlastnost instance. Veřejná metoda VratInstanci/nebo getter veřejné property která při prvním volání inicializuje instanci a vrátí ji, a při každém dalším volání vrací stále tu samo instanci.

Ukázka implementace Singletonu v C#

Základní Singeton


sealed class Singleton
{
    private Singleton() { }

    private static Singleton _Singleton = null;
    
    public static Singleton Instance
    {
        get
        {
            if (_Singleton == null) _Singleton = new Singleton();
            return _Singleton;
        }
    }

    .... následují další nestatické metody...
}
    

Thread-Safe Singeton


sealed class ThreadSafeSingleton
{
    private ThreadSafeSingleton() { }

    private static ThreadSafeSingleton _Singleton = null;

    private static readonly object _Lock = new object();

    public static ThreadSafeSingleton Instance
    {
        get
        {
            if (_Singleton == null)
            {
                lock (_Lock)
                {
                    if (_Singleton == null)
                    {
                        _Singleton = new ThreadSafeSingleton();
                    }
                }
            }
            return _Singleton;
        }
    }

    .... následují další nestatické metody...

}
    

Ukázka jednoduché implementace Singletonu

Použito:

  • Pro zobrazení C# kódu použito highlight.pack.js link