Singleton(Design Pattern)

Metin Topcu
3 min readMar 16, 2023

--

Singleton deseni bir sınıfın her zaman tek bir örneğinin olmasını garanti eder.

Singleton bir nesnenin sadece bir örneğinin olduğundan emin olmak ve bu nesneye ihtiyacınız olduğunda kodunuzda her yerde aynı çağrılmasını sağlamak için kullanılır.Singleton creational pattern türüdür.

Kullanacağım içerikler ağırlıklı olarak refactoring.guru ve evrenbal.com sitesinden alınmıştır.

Örnek Problem

Singleton deseni SOLID programlama prensiplerinin en başında gelen tekil sorumluluk prensibine (Ara:metintopcu1.medium.com/solid-prensipleri-327f633f4239) aykırılığa neden olan iki sorunu tek seferde çözüyor:

  1. Bir sınıfın yalnızca tek bir örneğe sahip olduğundan emin olun:

Neden bir sınıfa ait birden fazla örnek var olsun ki? Bunun en yaygın nedeni, bir veritabanı veya dosya gibi bazı paylaşılan kaynaklara erişimi kontrol etmektir.

İstemciler sürekli aynı nesne ile çalıştıklarını farkında bilme olmayacaktır.

2. O örneğe global bir erişim noktası sağlayın.

Bazı önemli objeleri saklamak için kullandığınız global değişkenler oluyor mu? Bu yöntem her ne kadar kullanışlı olsa da güvenilir değildir çünkü herhangi bir kod bu nesnelerin üzerine yazıp uygulamanızın çökmesine neden olabilir.

Singleton deseni aynı global değişkenlerde olduğu gibi nesneye istediğiniz yerde ulaşabilmesinizi sağlar ve aynı zamanda başka bir kodun nesnenizin üzerine yazmasını da engeller.

Bu sorunun bir yönü daha var: sorun 1’i çözen kodun programın her yerine dağılmasını istemezsiniz, bu çözümün tek bir sınıf içinde olması -özellikle de kodunuzun geri kalanı zaten ona bağlıysa çok daha iyidir.

Çözüm

Singleton’ın tüm uyarlamalarında iki ortak adım vardır:

  • Varsayılan constructor’ı private yapın, böylece diğer nesneler bu singleton sınıfı ile new operatörünü kullanamazlar.
  • Constructor olarak görev yapacak statik bir oluşturma metodu yazın. Aslında bu metod arka planda özel constructor’ı çağıracak ve bunu statik bir alana kaydedecektir. Bu metoda daha sonra gelen tüm çağrılar ön belleğe alınmış bu nesneyi gönderecektir.

Kodunuz Singleton sınıfına erişebiliyorsa Singleton’un statik metoduna da erişebilir. Bu metod her çağrıldığında aynı nesne döndürülecektir.

Gerçek Dünya Örneği

Hükümet, Singleton modelinin mükemmel bir örneğidir. Bir ülkenin yalnızca bir resmi hükümeti olabilir. Hükümetleri oluşturan bireylerin kişisel kimlikleri ne olursa olsun, “X Hükümeti” başlığı, sorumlu insan grubunu tanımlayan küresel bir erişim noktasıdır.

Yapı

Singleton sınıfı, kendi sınıfının aynı örneğini döndüren getInstance statik yöntemini bildirir. Singleton’ın yapıcısı, istemci kodundan gizlenmelidir. Singleton nesnesini almanın tek yolu getInstance yöntemini çağırmak olmalıdır.

Uygulanabilirlik

Programınızda kullandığınız bir sınıfın tüm istemcilerin kullanabileceği sadece tek bir örneğinin olması için singleton desenini kullanabilirsiniz; örneğin bir programın farkı bölümlerinde kullanılan bir veritabanı nesnesi.

Singleton deseni kendi özel oluşturma metodu dışında nesne oluşturulmasını engeller. Bu özel metod daha önce oluşturulmuş bir nesne varsa onu, yoksa yeni oluşturacacağı nesneyi döndürür.

Global değişkenler üzerinde daha sıkı bir kontrole ihtiyacınız olduğunda singleton desenini kullanın.

Global değişkenlerin aksine Singleton deseni bir sınıfın her zaman tek bir örneğini olmasını garanti eder. Singleton sınıfının kendisi dışında hiç bir şey önbellekteki örneği değiştiremez.

Not: Sınırlamayı ayarlayabilir ya da tamamen ortadan kaldırıp birden fazla Singleton örneği oluşturulmasını sağlayabilirsiniz. getInstance metodunuzun içeriğini değiştirerek sınıfınızın istediğiniz davranışı göstermesini sağlayabilirsiniz.

Nasıl Uygulanır ?

1.Sigleton instance depolamak için class a private static alan ekleyin.

2.Singleton instance’ yi çağırmak için public static method oluşturun

3.Static method içerisinde “Lay initialization” implement edin. İlk çağrıda new object yapılmalı ve onu static field’a koymalıdır. Method sonraki tüm çağrılarda her zaman bu örneği döndürmelidir.

4.Constructor class ı private yapın. Class ın static methodu yine de constructor ı çağırabilir ancak diğer objeleri çağıramaz.

5.Client codu nu gözden geçirin ve singleton’ın constructor ına yapılan tüm doğrudan çağrıları static creation method una yapılan çağrılarla değiştirin.

Diğer Tasarım Kalıpları İçin Linkler

Factory/Method

Iterator

Observer

--

--

Metin Topcu
Metin Topcu

No responses yet