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.