C# Singleton Tasarım Deseni

Creational Design Pattern olan Singleton Design Pattern programımızın çalışma süreci boyunca singleton uyguladığımız nesneden sadece bir instance almamızı sağlar. Singleton nesnemiz aynı zamanda global düzeyde erişilebilir olur.

Ne zaman kullanırız?

Bir nesnemizden sadece bir örneğinin (instance) alınmasını istenildiği zaman Singleton Design Pattern kullanırız.

Bu tasarım deseni kullanımı diğer tasarım desenlerine göre oldukça basittir. Yapmamız gerekenler sırasıyla söyledir..

  1. Constructor (Yapıcı Metot) access modifiers (Erişim belirleyicisi) ı private yapılır.

  2. Kullandığımız nesnenin kendi türünden statik bir nesne tanımlanır.

  3. Tanımladığımız nesneyi kullanmak için statik property ya da statik metot tanımlanır.

Adımlarımızı sıraladık şimdi uygulamaya geçelim.

public class SingletonNesnem
{
    // Programımız çalıştığı anda nesneniyi ram ' çıkarmış ve private tanımlayarak dışarıdan erişilmesini engellemiş olduk
    private static SingletonNesnem instance = new SingletonNesnem();
    // Constructor Private olarak tanımlayarak new anahtar sözcüğü kullanılmasını engeliyoruz
    private SingletonNesnem() { }
    // Oluşturduğunuz instace nesnemize dışarıdan erişilmesi için bir property tanımladık.
    public static SingletonNesnem Instance
    {
        get
        {
            return instance;
        }
    }
}

Yukarıdaki yaptığımız SingletonNesnem ize tanımladığımız property ile erişim sağlayabileceğiz. Bunun diğer bir yolu ise metot tanımlayarak dışarıdan erişilmesini sağlayabiliriz.

public class SingletonNesnem
{
    // Programımız çalıştığı anda nesneniyi ram ' çıkarmış  private tanımlayarak dışarıdan erişilmesini engellemiş olduk
    private static SingletonNesnem instance = new SingletonNesnem();

    // Constructor Private olarak tanımlayarak new anahtar sözcüğü kullanılmasını engeliyoruz
    private SingletonNesnem() { }

    //Property yerine Metot ile dışarıdan erişilmesini sağladık
    public static SingletonNesnem GetInstance()
    {
        return instance;
    }
}

SingletonNesnem Sınıfına sigleton tasarım desenini 2 yöntem kullanarak uygulamış olduk. Yaptığımız adımları incelersek..

Bir sınıfım var adı SingletonNesnem bu sınıfımından tek bir nesne üretilmesini istedim.

Nesne üretmek için kullanılan new anahtar kelimesini kullanılmaması için sınıfımızın constructor ını private olarak tanımladık. Artık SingletonNesnem nesne = new SingletonNesnem(); yazıldığındaki kullanımını engellemiş oldum.

Sınıfımın türünde bir nesne tanımladım private ve static olarak programımız çalıştığı anda nesnemden instance alınmış olacak.

Sonra bu nesnemi dışarıdan erişilebilir ve kullanılabilir kılmak için property ve metot tanımladım.

Property için, sınıfımızın türünde static olarak ve sadece geriye değer döndüren olarak tanımladık ve geriye ise yukarıda oluşturduğumuz nesnemizi döndürdüm.

Metot için, yine aynı şekilde sınıfımızın türünde geriye dönen ve static bir metot tanımladık return de ise yukarıda oluşturduğumuz nesnemizi geriye döndürdüm.

Böylelikle programımız ilk çalıştığı andan itibaren instance nesnemin ilk oluşturulan nesne olduğunu garantilemiş olduk.

Burada dikkat ettiyseniz programımız çalışır çalışmaz SingletonNesnemden bir nesne üretiliyor ve o üretilen nesne kullanılıyor. Eğer ki program çalıştığı anda üretilmesini istemiyorsak yanlızca biz onu kullanmak istediğimiz zaman üretilmesini istediğimiz de..

Böyle yazabiliriz.

public class SingletonNesnem
{
    //Nesnemi tanımlıyorum ama ram' e çıkarmıyorum
    private static SingletonNesnem instance;
    private SingletonNesnem() { }
    //Propety olarak
    public static SingletonNesnem Instance
    {
        get
        {
            //instance == null sa SingletonNesnemden bir nesne üret geriye döndür
            //instance != null varolan nesnemi geriye döndür
            return instance ?? (instance = new SingletonNesnem());
        }
    }
    //Metot olarak
    public static SingletonNesnem GetInstance()
    {
        //instance == null sa SingletonNesnemden bir nesne üret geriye döndür
        //instance != null varolan nesnemi geriye döndür
        return instance ?? (instance = new SingletonNesnem());
    }
}

Program çalışır çalışmaz nesnemiz ram e çıkmadı biz nesnemizi ilk defa kullanmak istediğimizde ram e çıkmasını sağladık.

Ek olarak burada Coalescing operatörünü kullandım.

Bildiğim kadarıyla bir şeyler yazmaya çalıştım inşallah birilerinin faydalanması dileğiyle.