Singleton design pattern nedir?

Singleton tasarım kalıbı, bir sınıfın yalnızca bir örneğinin oluşturulmasına izin veren bir creational (yaratımsal) tasarım kalıbıdır. Bu, herhangi bir zamanda yalnızca bir örneğin var olduğu ve tüm istemcilerin aynı örneğe erişebildiği anlamına gelir.

Singleton tasarım kalıbı, aşağıdaki durumlarda kullanılabilir:

  • Tek bir örnek yaratmak gerekiyorsa
  • Bu örneğe tüm istemcilerin erişmesi gerekiyorsa
  • Yaratılan örneğin tek bir noktadan kontrol edilmesi gerekiyorsa

Singleton tasarım kalıbı, sınıfın yapısını ve erişim yöntemlerini kontrol eder. Bu sayede, aynı sınıfın farklı yerlerinde oluşturulan örneklerin farklı değerler almamasını sağlar. Böylece, özellikle kaynak yoğun işlemlerde kullanıldığında, gereksiz bellek tüketimini önler.

Singleton tasarım kalıbı, thread safe bir şekilde uygulanmalıdır, yani birden fazla thread aynı anda örneğe eriştiğinde sorun oluşmamalıdır. Ayrıca, kodun okunaklılığı ve sürdürülebilirliği için de doğru şekilde uygulanması önemlidir.

class Singleton:
    __instance = None

    @staticmethod
    def getInstance():
        """Tek bir örneğin var olduğunu kontrol eder ve gerekirse örneği yaratır."""
        if Singleton.__instance == None:
            Singleton()
        return Singleton.__instance

    def __init__(self):
        """Örneğin sadece bir kez oluşturulmasını sağlar."""
        if Singleton.__instance != None:
            raise Exception("Bu sınıftan yalnızca bir örnek oluşturulabilir!")
        else:
            Singleton.__instance = self

    def performAction(self):
        """Singleton örneği üzerinde işlem yapar."""
        print("Singleton örneği üzerinde bir işlem gerçekleştiriliyor...")

Bu örnekte, Singleton sınıfı yalnızca bir kez örneklenmesini sağlar. __instance özelliği, örneğin kendisini depolar. getInstance metodu, örneğin olup olmadığını kontrol eder ve varsa mevcut örneği döndürür, yoksa yeni bir örnek yaratır ve onu döndürür. __init__ metodu, yalnızca bir kez çalıştırılabilir ve __instance özelliğine kendisini atar. performAction metodu, örneği kullanarak bir işlem gerçekleştirir.

Aşağıdaki kod, Singleton sınıfının nasıl kullanılacağına dair bir örnek gösterir:

s1 = Singleton.getInstance()
s2 = Singleton.getInstance()

if s1 == s2:
    print("s1 ve s2 aynı Singleton örneği üzerinde çalışıyor.")
else:
    print("s1 ve s2 farklı Singleton örnekleri üzerinde çalışıyor.")
    
s1.performAction()  # "Singleton örneği üzerinde bir işlem gerçekleştiriliyor..." yazdırır.

Bu kodda, getInstance metodu aracılığıyla Singleton sınıfının yalnızca bir örneği yaratılır. Ardından, s1 ve s2 değişkenleri, getInstance metodunun döndürdüğü aynı örneği tutar. performAction metodu, bu örneği kullanarak bir işlem gerçekleştirir. Sonuç olarak, s1 ve s2 aynı örneği temsil eder ve yalnızca bir kez işlem yapılır.