Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

C# Singleton Design Pattern(Singleton Tasarım Deseni)

Bu yazımda C#’ta Singleton Design Pattern kullanımını anlatmaya çalışacağım.Yazılım dünyasın da bir çok tasarım deseni mevcuttur.Nesnenin oluşturulması ve yönetilmesiyle ilgili olan Creatinal Patterns grubundan Singleton desenini anlatmaya çalışacağım.Diğer desenlerle ilgili yazılar ilerideki zamanlar da hazırlamayı düşünüyorum.
Singleton Deseni
Bu yapıda kullanıcıya kendi başına bir nesne yaratma izni verilmez.Kullanıcı bizden sadece nesne talep edebilir.Ve bizden nesne talep ettiğinde de biz ona her defasında bellekte var olan nesneyi veririz.Böylece kullanıcı sadece tek bir nesne ile çalışmak zorunda kalır.Yani kullanıcı bir iş için 50 tane farklı nesne üretemez.
Mesela SqlConnection nesnesini bazı durumlar da çok üretmek zorunda kalıyoruz.Birden fazla SqlConnection nesnesi üretip belleğe yük bindireceğimize var olan SqlConnection nesnesi üzerinden işlem yapmamız performans açısından olumlu olacaktır.
Peki bu işi nasıl yapacağız?
Öncelikle kullanıcıya nesne yarattırmamız gerektiği bariz ortada.
Bunu sağlayabilmek için Constructor private yapılarak, kullanıcın nesne yaratması engellenir.
Kullanıcı constructor kullanarak nesne yaratamayacağı için, nesneyi ona biz vermeliyiz.Bu da ancak o class tipinde bir nesne gönderen static bir metod ya da özellikle(property) mevcuttur.
Kullanıcıya bu metod ya da property her defasında aynı nesneyi göndermeli.
Bu yüzden metod ya da property içinde if kontrolüyle aynı nesneyi göndermeyi sağlayacağız.

Şimdi ben Singleton.cs adında bir class oluşturuyorum.Ve bu classı yukarda anlattığım şekilde constructorını private yapıp,Singleton classından nesne oluşturulmasını engelliyorum.Singleton tipinde geri dönüş değeri olan,static bir metod yazıp kontrollerle her defasında aynı nesneyi gönderiyorum.Bir kereliğine oluşturmaya mahsus.
1.YOL

    class Singleton
    {
        private Singleton()
        {

        }
        private static Singleton nesne;
//static metodun içinde bu referansı kullanabilmemiz için static olması gerekiyor.
//static metodun içinde sadece static metodlar kullanılabilir.
        public static Singleton NesneVer()
        {
            if (nesne==null)
            {
                nesnem = new Singleton();
            }
            return nesne;
        }
    }

Yukarıdaki kod bloğunu izah edeyim.Boş constructoru private yaparak başka classta new operatörüyle yeni bir nesne yaratılmasını engelliyoruz.O constructorı bu classta kullanabiliriz.Bir tane static Singleton tipinde nesnem adında referans oluşturuyoruz.Ama hemen nesneyi ona bağlamıyoruz.Çünkü Singleton tipinde geri dönen static metodumuz da kontrollü bir şekilde bağlayacağız.
Eğer nesnem adındaki referansımız null değerine sahipse nesnem referansına bir Singleton nesnesi bağlıyoruz ve bunu return ediyoruz.
Şimdi sunum katmanın da bu sınıftan nesne nasıl çağırıyoruz ona bakalım.

Singleton nesne = new Singleton();
//Bu şekilde nesne oluşturamazsınız.Hata alırsınız...
Singleton nesne = Singleton.NesneVer();
//Bu şekilde Singleton dönen static metodu çağırarak nesneyi oluşturabilirsiniz.

Şimdi Singleton.cs sınıfından iki nesne oluşturalım.Bakalım bu sınıftan oluşturduğumuz nesnelerin hepsi bir tek aynı nesneyimi gösteriyor.

Singleton nesne1 = Singleton.NesneVer();
Singleton nesne2 = Singleton.NesneVer();

Gördüğünüz gibi nesne1 ve nesne2 referanslarına Singleton sınıfındaki NesneVer() static metoduyla nesne verdik.Bakalım bu iki referansta aynı nesneyimi gösteriyor.
Bir çok yöntemle bunu test edebiliriz.
Test 1

            if (nesne1==nesne2)
            {
                MessageBox.Show("Test");
            }

Test 2

            if (nesne1.Equals(nesne2))
            {
                MessageBox.Show("Test");
            }

Test 3

            if (nesne1.GetHashCode()==nesne2.GetHashCode())
            {
                MessageBox.Show("Test");
            }

GetHashCode() : Bu metot geriye nesnenin bellekteki adresini döndürür.Dolayısıyla bu if çalışırsa referanslar aynı nesneyi gösteriyor deriz
Yukarıdaki herhangi bir test sonucunda mesaj kutusunda “Test” yazısını göreceksiniz.
Singleton Design Pattern’in bir başka yöntemi de diğer sayfa da anlatılmıştır.

Bunlar da hoşunuza gidebilir...

9 Cevaplar

  1. Hüseyin Özdil dedi ki:

    Çok teşekkür ederim hocam

  2. root dedi ki:

    Gençay hocam merhabalar,
    Sitenizde Singlenton design pattern ile ilgili yazıyı okudum aynı zamanda youtube atmış olduğunuz videoyuda izledim. Fakat kafama takılan size sormak istediğim bir soru var. Şimdi ben projemi normalde Db-first yaklaşımıyla db yi projeme bağlıyordum ve controller kısmında örneğin; Northwind ent= new Northwind(); diyip ent.Emplooyee diyip alanlarıma ulaşıyordum vs buraya kadar sıkıntı yok idi şimdi ben singleton design pattern kullanacağım zaman singleton ile db-first olayını nasıl ilişkilendire bilirim bunu yapamadım. Bana bu konuda yardımcı olabilirseniz sevinirim.

    • Gençay dedi ki:

      Merhaba,

      Database First bir yaklaşım. Lakin Singleton bir tasarım deseni. İlişkilendirmek istediğiniz konu context nesnesini singleton olarak tasarlamak mı?

  3. Yasin dedi ki:

    Hocam singleton yapısını proje içerisinde bir çok classta kullanmak bizi kod tekrarına düşürmez mi ? bu yapıyı generic bir hale getirmek ne kadar mantıklı olur

  4. Hero dedi ki:

    Merhaba,

    Hocam bu bilgileri açık ve anlaşılır dille anlattığınız için çok teşekkür ederim. Allah razı olsun

  5. Cagatay Gur dedi ki:

    Merhaba,

    Microsoft artik sql connection gibi durumlarin yonetimini iyi yapiyor, bu sebeple neden projejelerimizde AddTransient, AddScoped yerine AddSingleton kullanmayalim?

    Yani AddSingleton ile projeyi aslinda iyi bir sekilde yonetibiliriz. Rica etsem sizde dusuncelerinizi paylasir misiniz

    https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-connection-pooling?redirectedfrom=MSDN

    • Gençay dedi ki:

      Konuya dair düşüncem pek yok gibi 🙂 İsterseniz siz düşüncelerinizi örnek durumlar üzerinden biraz daha açınız. Belki o zaman zihnimizde muhakeme edecek fikirler canlanabilir.
      Sevgiler.

  1. 22 Nisan 2016

    […] yanında ayriyetten Facade sınıfını Singleton Design Pattern olarak tasarlamanızı […]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir