Swift with Furkan

Singleton Pattern Nedir? Nasıl Kullanılır?


Tasarım Patterni yazılımcılar arasında karşılaşılan problemleri çözmek için kullanılan deneyimli yazılımcılar arasında deneme yanılma yoluyla bulunan birer çözüm yöntemleri sistemidir. Genellikle 5 ana başlık altında incelenen Tasarım patternlerinden bu makalede Creational Pattern (Yaratıcı Tasarım Kalıpları), alt başlıklarından Singleton Patternini (Tek Tip Tasarım Kalıbı) ele alacağız.


Creational Pattern (Yaratıcı Tasarım Kalıpları), nesnelerin oluşturulma biçimi ile alakalıdır. Kontrollü bir şekilde nesneler oluşturarak düzensizliği ve kararsızlığı minimize ederler.


Singleton şablonunu, bir uygulamanın, bütün muhtemel senaryolarda, herhangi aksi bir şart bulunmadığı herhangi bir sınıfın yalnızca tek örneğine sahip olmasını istediği bir tasarım çözümü olarak tanımlayabiliriz. Yani Singleton’da tek bir sınıf tek bir nesnenin oluşturulmasından sorumludur. Ancak bu nesne global olmalıdır ve diğer tüm sınıflar tarafından istenildiğinde ulaşılabilir şekilde olmalıdır. Bu sebeple Creational Tasarım Kalıpları içinde en basit olanı bu Singleton tasarım kalıbı olarak söyleyebiliriz. Yalnızca bir kez oluşturulacak olduğundan nesneye ihtiyaç duyuluncaya kadar yaratılmamış olabilir.
Singleton patterninde kendini somutlaştırmayı sağlayan tek bir sınıf içerme sebebi birden fazla örnek oluşturmadığından emin olmak içindir. Örneğe genel bir erişim sağlanması sebebiyle aynı örnek her zaman kullanılabilir, çünkü her defasında direkt yapıcıya ulaşmak mümkün değildir. Global erişim izinleri her kesin ulaşması için kullanışlı olsalar bile, bir kod potansiyel olarak bu global değişkenlerin içeriğinin üzerine yazılıp uygulanması çökertip zarar verebileceği için pek de güvenli değillerdir. Diğer patternlerde mevcut olan küresel bir değişken gibi, Singleton kalıbı programın herhangi bir yerinden bir nesneye erişime olanak tanır ancak farklı olarak burada bu örneğin başka bir kod tarafından üzerine yazılmasına, değiştirilmesine engel olur. Bu sebeple Singleton patterni daha avantajlı olarak değerlendirebiliriz. Kodun üzerine eklenenle uygulama çökertmesi dışında sorunu çözüyor da olabilir ancak çözümü sağlayan kodun programın her tarafına tüm sınıflara dağıtılması bu patternle engellenir. Zaten kodun kalan kısmı yalnız bu Singleton patternin olduğu sınıfa bağlıysa, sadece tek bir sınıfta yer almak çok daha mantıklıdır.
Singleton kalıbı birçok yazılım programında kullanılabilir java başlıca olmak üzere PHP, C++, Delphi, Python, Kotlin bunlara örnektir. Bu patterni daha iyi anlanmak için kodda kullanım yapısını inceleyebiliriz.

Öncelikle oluşturulan sınıf gizlenir. Ardından genel statik hepsinde geçerli olan (getInstance()) komutu ile bir işlemle bu sınıfın sahip olduğu tek bir örnek tanımlanır. Statik yöntemin içine lazy initialization (tembel başlatma) uygulanır. Yalnızca ilk çağrıda yeni bir nesne oluşturulur ve statik alan içine konulur. Bir defaya mahsus nesne oluşturulduktan sonra bu yöntem her zaman sonraki bütün çağırmalarda bu örneği döndürür. Bu modelde esas olay sınıf içindeki örneğin somutlaştırılıp bir kez açılıp sonrasında kendi kontrolünü sağlamasıdır. Oluşturan (constructer) gizli olduğu için onun dışında yani sınıfın dışınca kimsenin nesneyi değişterememesini kontrol edememesini sağlar. Bu Singleton patterninde sınıf ve nesne adı (Singleton.getInstance()) operasyonu/ komutu kullanılarak oluşturulur.


Kullanım alanları olarak incelediğimizde abstract (soyut) factory, factory method, builder (kurucu), ve prototype pattern uygulamalarında sık sık Singleton patternleri kullanımı görürüz. Cephe (facade) nesneleri sadece bir adet olmasından ötürü burada yaygındır; aynı şekilde durum (state) nesnelerinde de kullanım sıktır. Global değişkenlerdense Singleton kalıbı tercih sebebidir; çünkü diğerleri gibi karmaşaya sebep olmazlar. Kod içinde tekrara düşmeleri engeller. Diğer birçok dildeki global değişkenler kaynak ve alan kullanırken, Singleton patternler lazy allocation and initialization (tembel tahsis ve başlatma) yapmayı sağlarlar. Bu açıdan değerlendirildiğinde karmaşa ve kaynak kullanımı azaltılması için Singleton kullanımı daha ideal olacaktır.

Exit mobile version