C# Software Development

Singleton Design Pattern Nedir?

Written by Burak Yılmaz

Hepimizin bildiği gibi kod yazarken tanımladığımız değişkenler, oluşturduğumuz nesneler bellekte bir yer tutar. İyi bir yazılımcı kod yazarken bu bellek yönetimini de düşünmelidir. Kodumuzu yazarken; gelen her bir istek için, yeni bir nesne oluşturmanın performans kaybına neden olacağı  bir durumu farkettik. İşte bu gibi durumlarda imdadımıza Singleton Design Pattern‘ı yetişiyor.

Singleton, bir sınıfın tek bir instance’ını almak için kullanılır. Yani bir sınıfı bir kere create ettikten sonra, nereden ulaşırsak ulaşalım bize aynı örneği dönecektir. Mesela bir Asp.Net projesinde singleton tasarım kalıbı kullanarak oluşturduğumuz bir nesne, IIS resetlenmediği sürece  hep aynı instance üzerinden çalışacaktır. Sistem ayakta olduğu sürece yeni bir örnek kesinlikle oluşturulmaz.

Basit anlamda bir Singleton nesnesi aşağıdaki gibi oluşturulur:

    class ConnectionManager
    {
        private static ConnectionManager Instance;
        private ConnectionManager()
        {
             
        }

        public static ConnectionManager ActiveInstance
        {
            get
            {
                if (Instance == null)
                {
                    Instance = new ConnectionManager();
                    return Instance;
                }

                return Instance;
            }
        }

    }

Bir  web projesinde; aynı anda birden fazla thread singleton nesneye erişmeye çalıştığında, bir işlem bitmeden diğeri için örnekleme yapar. Bunu engellemek için Kilitleme yapacağız. Böylelikle uygulamamız thread-safe olacaktır . Lock işlemini de şu şekilde yazabiliriz.

    class ConnectionManager
    {
        private static ConnectionManager Instance;
        private static object _lockObject = new object();
        private ConnectionManager()
        {
             
        }

        public static ConnectionManager ActiveInstance
        {
            get
            {
                //Eğer instance null değil ise thread-safe gözetmeksizin döndürülür.
                if (Instance == null)
                {
                    //Eğer null ise nesneyi diğer threadlerin erişimine kapatıyoruz.
                    lock (_lockObject)
                    {
                        if (Instance == null)
                        {
                            Instance = new ConnectionManager();
                        }
                    }
                }

                return Instance;
            }
        }

    }

* Hatırlanması Gereken Noktalar :

  • Tüm istemcilerin aynı instance’dan işlem yapmak istediği durumlarda kullanılmalıdır. Bir nesneyi tekrar tekrar oluşturmayı engeller.
  • Tasarım kalıbı kullanılmadan önce ihtiyaç iyice gözden geçirilmelidir.

About the author

Burak Yılmaz