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..
-
Constructor (Yapıcı Metot) access modifiers (Erişim belirleyicisi) ı private yapılır.
-
Kullandığımız nesnenin kendi türünden statik bir nesne tanımlanır.
-
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.