Gerçek Dünya Senaryosu :

Dünya üzerinde süperman'den sadece ama sadece bir tane var. Süperman burada tekil'dir.

Basitçe :

Tekil(singleton) tasarım kalıbı bir nesnenin sadece ama sadece tek bir örneğinin olabileceği söyleyen nesnedir.

Dikkat :

Tekil tasarım kalıbı genel olarak anti-pattern olarak anılır. Olabildiğince kullanımından kaçınılması gerekmektedir, bunun sebebi uygulamanın(application'ının) her yerinde tanımlıdır ve bu tekil nesnenin değişimi uygulamanın her yerini etkileyecektir. Aynı zamanda global olarak ulaşılabilen nesneler debug edilmesi zordur.
Tekil (Singleton) tasarım kalıbının bir diğer dezantajlarından uygulamadaki diğer kod boklarının tekil(singleton) yapıya sıkı bağımlılık içermesi olabilir.
Tekil tasarım kalıbının bir diğer dezavantajlarından biri ise kod taklit etme(mocking) işleminin zorlu olmasıdır.

Yazılım Örneği :

Öncelikle süperman sınıfımızı yaratalım :

Not : Multihread(çok kanallı) kullanımında aşağıdaki kod bloğu istendiği gibi çalışmayabilir. Bu sebep ile burayı anladıktan sonra ikinci Superman class'ı örneğinin geçrek dünya kullanımını daha uygun olacaktır!!

public class Superman
{
    private static Superman _superman;
    private static string _name;

    private Superman(string name)
    {
        _name = name;
    }
    public static Superman GetInstance()
    {
       
        if (_superman == null)
        {
            _superman = new Superman("Clark Kent");
        }
        return _superman;
    }
    public void PrintSupermanName()
    {
        Console.WriteLine(_name);
    }
}

Client Kodu aşağıdadır :

var superman =Superman.GetInstance();
superman.PrintSupermanName();

Superman sınıfını multithread safe (çok kanallı yapı için güvenli) hale getirelim, client kodu hala yukarıdaki gibidir.

public class Superman
{
    private static Superman _superman;
    private static string _name;

    private static readonly object dummy = new Object(); // dummy lock object eklendi.
    
    private Superman(string name)
    {
        _name = name;
    }
    public static Superman GetInstance()
    {
        // double null checking ve lock eklendi
        if (_superman == null)
        {
            lock (dummy)
            {
                if (_superman == null)
                {
                    _superman = new Superman("Clark Kent");
                }
            }
        }
        return _superman;
    }
    public void PrintSupermanName()
    {
        Console.WriteLine(_name);
    }
}

Ne zaman kullanılır ?
Tekil tasarım kalıbı yani singleton bir nesnenin uygulama hayatı boyunca yalnız ve yalnız bir tane örneği(instance) olmasını istediğimiz zaman kullanırız. Ama kullanımından kaçınılması gereken bir tasarım kalıbıdır.