Singleton tasarım deseni bir programın yaşam süresince belirli bir nesneden sadece bir örneğinin(instance) olmasını garantiler. Aynı zamanda bu nesneye global düzeyde mutlaka erişimi hedefler.
Örneğin veritabanı işlemleri yaptığınız bir program düşünün. Burada connection nesnesini singleton olmasını istersiniz. Çünkü her seferinde yaratılması demek her seferinde de kapatılması demektir. Kapatılmazsa connection açık kalır bu programın patlatır. Ama singleton olursa program yaşam döngüsü boyunca sadece bir örneği olur ve kapatılması ve kontrolu daha kolay olacaktır.
Singleton deseni uygularken constructor private tanımlanır. Çünkü amaç nesneden sadece bir örneğin olamasını garantilemek olduğu için new ile nesnenin örneğinin yaratılması kısıtlanır.
class SingletonWithProperty
{
private static SingletonWithProperty _singletonClass;
private SingletonWithProperty()
{
}
public static SingletonWithProperty SingletonClass
{
get
{
if (_singletonClass == null)
_singletonClass = new SingletonWithProperty();
return _singletonClass;
}
}
}
static void Main(string[] args)
{
SingletonWithProperty singletonClass = SingletonWithProperty.SingletonClass;
}
Bu örnek singleton sınıfımızı property ile nasıl yaratabileceğimizi gördük. SingletonClass propertsini çağırdığımızda eğer private değişkenimiz _singletonClass null ise örneği oluşturulup bu değişkene atanıyor ve bu değişken döndürülüyor. Eğer null değilse ise eskiden yaratılan değişken değeri döndürülüyor. Bu sayede nesnenin örneğinin bir kez yaratılması garanti altına alınıyor.
Bunu property üzerinden değilde metod ile de yapabiliriz. Birde o şekilde yazalım:
class SingletonWithMethod
{
private static SingletonWithMethod _singletonClass;
private SingletonWithMethod()
{
}
public static SingletonWithMethod GetInstance()
{
if (_singletonClass == null)
_singletonClass = new SingletonWithMethod();
return _singletonClass;
}
}
static void Main(string[] args)
{
SingletonWithMethod singletonClass = SingletonWithMethod.GetInstance();
}
Bu örnektede yeni nesne yaratımı aynı şekilde GetInstance() metodu ile sağlanmış oldu.
Bu iki örnekte thread safe uygulama olmadı. Uygulama tek thread üzerinde çalışıyor ise bu iki örnekteki kullanım gibi singleton gerçekleştirilebilir. Fakat multithread uygulamarda bu örnekler işe ayramaz ekstra kontroller yapılması gerekir. Fakat bu kontrollerde malesefki programı yavaşlatır. O yüzden multithread değilse uygulamanız yukardaki örnekleri kullanmanızı öneririm. Şimdi multithread uygulamalarda nasıl kullanılıyor ona bakalım: