İçeriğe geç

Singleton Tasarım Kalıbı

Merhaba arkadaşlar,

“Design Pattern” deyince akla ilk gelen pattern olan “Singleton Design Pattern” ile tasarım kalıpları yazı dizisine başlıyoruz. 

TASARIM KALIPLARI:  

Design patternler, sıklıkla karşılaşılabilecek sorunlara, bu sorunları soyutlayarak tasarlanmış genel çözüm üretirler.

Pattern demek, aslında bir sorun ve bu sorunun da çözümü demektir.

Bu sorunlar da 3 ana kategoriye ayrılmış durumdadır.

  • Creational
  • Structural
  • Behavioral

Creational “oluşturucu” ya da “yaratımsal” olarak Türkçeye çevrilebilir. Yani bu kategorimizin derdi, nesne oluşturulurken sıklıkla bazı problemlerle karşılaşıyoruz ve bu problemlerin genel çözümleri bu kategoride birleşmiş.

 

Structural “yapısal” demektir. Nesneler arasındaki ilişkiler esnasında çıkan problemlere getirilen çözümler de bu kategoride yer alırlar.

 

Behavioral da “davranışsal” demektir. Nesnelerin çalışma zamanında davranışlarında değişiklik yaparken karşılaşılan problemlere getirilen çözümler de bu kategoride yer bulurlar.

 

SORUN

Peki singleton hangi sorun sonucunda ortaya çıkmıştır? 

Singleton un kelime anlamı tekil demektir. Bu isimden biraz da olsa anlaşılabileceği üzere, ilgili nesneden bir tane oluşsun istiyorsak singleton design pattern ını rahatlıkla kullanabiliriz. 

Oluşturmak dedik, o zaman anlıyoruz ki singleton bir creational tasarım kalıbıdır.

Design patternlar sayesinde amerikayı yeniden keşfetmekten kurtuluruz ve ayrıca bize bakış açısı kazandırırlar.

Şöyle ki, bir nesneden sadece bir tane oluşturmak istiyoruz. Bununla ilk defa karşı karşıya gelen bir kişi buna kafa yormalı.

Biz de yoralım. Elimizde bir class olsun ve bundan da sadece bir tane oluşturmak istediğimizi düşünelim.

Singleton adında bir sınıf oluşturalım.

public class Singleton {

}

Şimdi ben bu classı başka yerde oluşturabiliyor muyum görelim?


public class Main {

public static void main(String[] args) {
Singleton singleton = new Singleton()
}
}

Görüldüğü gibi dışardan bu classı oluşturmak için önümde hiçbir engel yok. New ile sınıflar oluşturulduğunda ilgili sınıfın constructor ı çağrılır. Biz şu anda hiçbir constructor oluşturmamışız. Hiçbir constuctor olmadığı durumda java bunu bizim için halleder ve sanki bir constructor varmış gibi davranır.

O zaman işimiz constructorlar ile diyebiliriz. Görmek açısından, bir default constructor oluşturalım ve classın oluşturulduğu yerden gerçekten de buraya mı gidiyoruz, görelim

public class Singleton {

public Singleton() {

}
}

Çözümü consturctorda arayacağımıza göre, akla ilk gelen şey constuctor u private yapmak. Yapalım.

public class Singleton {

private Singleton() {

}
}

Şimdi de main classı hata vermeye başladı. Bu hali ile de nesneyi hiç oluşturamadık. Çünkü constuctor private olduğunda o nesneye başka hiçbir yerden ulaşamayız ve nesne hiçbir zaman oluşmaz. Bunun tek bir yolu var. O da nesneyi kendi içinde oluşturmak.

Dışarı kapalı bir nesnenin kendisini içinde oluştursak bile, nesneyi nasıl alacağız? Nesnenin kendisini dönen bir metot yazabilirsek neden olmasın?

Bunun için de yine private bir global değişken tanımlayalım ve public bir metot ile de bunu dışarı açalım.

public class Singleton {

private Singleton singleton = new Singleton();

private Singleton() {

}

public Singleton getSingleton() {
return singleton;
}
}

Şimdi de şöyle bir problem var. Bu nesne oluşturulmadan metodunu da kullanamayız ki. Nasıl kullanılabilir hale getirebiliriz? Yani bir nesne yi new lemeden, o nesneye ait bir metodu nasıl kullanabiliriz?Metodu static yaparak!

Fakat bunu yaptığımızda metot içinde hata vermeye başlar. Peki sebebi ne? Sebebi static metotlar içinde sadece static değişkenler kullanımına izin verilir. Static değişkenler ve metotlar uygulama ayağa kaldırılırken oluşurlar. Dolayısı ile Metot yüklenirken henüz yüklenmeyen bir değişkeni kullanmak söz konusu olamaz. Bu sebeple değişkeni de static yapmamız gerekir.

public class Singleton {

private static Singleton singleton = new Singleton();

private Singleton() {

}

public static Singleton getSingleton() {
return singleton;
}
}

de static yapılır ve hata ortadan kalkar.

Main classı ise aşağıdaki gibi güncellenir. 

public class Main {

public static void main(String[] args) {
Singleton singleton = Singleton.getSingleton();
}
}

Bu hali ile classımızın tekil olmasını sağlayabilildik.

En basit hali ile singleton budur.

Tarih:JavaProgramlamaTasarım Kalıpları

İlk Yorumu Siz Yapın

Bir cevap yazın

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