Singleton (Tek Nesne) Design Pattern | Rıza Güneş
02-07-2016 Okuma Modu
Daha önceki yazılarımı okuduysanız dışarıdan nesne oluşturduğumuzda ilk başta construct yani kurucu metotun çalıştığını bilmeniz gerekir. Construct sihirli metotunu private yada protected yaparsak nesne oluşturmasını yalnızca sınıfın içinde veya miras alan sınıf içinde tanımlayabiliriz.
// Nesnemizin daha önceden oluşturulmadığını anlayabilmemiz için statik instance özelliği tanımlıyoruz.
private static SingletonObject instance = null;
//Sınıfımızın construct (kurucu) metodunu private yada protected tanımlıyoruz.
// oluşturulma sırasında kullanacağımız kodlar
// Dışarıdan sınıfımızı çağıracağımız metodumuz.
// eğer daha önce örnek oluşturulmamış ise sınıfın tek örneğini oluştur
instance  = new SingletonObject();
Yukarıdaki gibi bir sınıf oluşturduğumuzda dışarıdan new SingletonObject() dediğimizde hata verdiğini göreceksiniz. Bir önceki yazımda tasarım desenlerinin programlama dili gözetmeksizin bir standardı olduğunu söylemiştim, bunu pekiştirmek adına bir de PHP de nasıl olacağını görelim.
//Sınıfımızın construct (kurucu) metotu private yada protected tanımlıyoruz.
Gördüğünüz gibi mantık aynı, peki bu işlemler yeterli mi, başka türlü nesne oluşturabilir mi? Tabi ki evet, sınıftan yeni bir örnek oluşturamasak da var olan örneği kopyalayabiliriz, bu yüzden bunuda engellemek için clone sihirli metoduna düzenleme yapmalıyız.
Son olarak JAVA'ya özgü thead (kanal) yapısı sayesinde birden fazla kanaldan aynı anda getInstance metoduna istek yaparsak ve daha önce oluşturmadıysak birden fazla örnek oluşturmuş oluruz, bunu engellemek içinde metodumuzun başına synchronized anahtar kelimesini ekleyerek bu işlemleri sıraya koyar ve birden fazla oluşmasını engelleriz.
Lafı fazla uzatmadan son haline bakalım
// synchronized anahtar kelimemiz ile metodun aynı anda çalışmasını engelledik.
public synchronized static SingletonObject getInstance()
//Sınıfı clone sihirli metoduyla kopyalamaya çalıştığımızda CloneNotSupportedException ile kopyalanmasını engelliyoruz.
throw new CloneNotSupportedException("Ben eşsiz bir parçayım");
Yukarıda PHP'den de bahsettik o zaman onunda son haline bakalım
// dışarıdan kopyalanmasını engelledik
// unserialize() metodu ile tekrardan oluşturulmasını engelledik
Bu yazıma özel hem JAVA hem de eski dost PHP'de singleton tasarım deseni nasıl uygulanır ona değindim. Bundan sonraki yazılarımda yüksek ihtimal yalnızca JAVA ile ilerleyeceğim ama yukarıdaki örnekten de anlaşılacağı üzere mantıkları birebir aynıdır. Yani bu tasarım desenlerinin dili yok.