Singleton

14. März 2020

Dies ist wohl das gängigste und bekannteste Pattern schlechthin.

Es stellt sicher, dass von einer Klasse genau ein Objekt existiert. Dieses Singleton ist darüber hinaus üblicherweise global verfügbar.

https://de.wikipedia.org/wiki/Singleton_(Entwurfsmuster)

Ein Singleton hat ein statisches Feld, in dem die einzige Instanz dieser Klasse gespeichert ist. Der Konstruktor ist ebenfalls privat. Die einzige Möglichkeit eine Instanz zu erhalten ist die Methode „getInstance“ (o.ä.). Diese prüft beim Aufruf, ob die Instanz bereits erzeugt wurde. Wenn nicht, wird diese erst erzeugt und gespeichert. Anschließend wird der Wert aus dem statischen Feld zurückgegeben.

In C# gibt es die Klasse „Lazy<>“, die die Verwendung von Singleton wesentlich vereinfacht (kein double lock mehr notwendig).

public class Counter
{
    private static Lazy<Counter> _Instance = new Lazy<Counter>(() => new Counter());

    private int _Count;

    private Counter()
    {
    }

    public static Counter Instance
    {
        get
        {
            return _Instance.Value;
        }
    }

    public void Increment()
    {
        _Count++;
    }
    public void Reset()
    {
        _Count = 0;
    }
}

class Program
{
    static void Main(string[] args)
    {
        var instance = Counter.Instance;
        instance.Reset();
        instance.Increment();
    }
}