“Hiç uğraşamam…”

twitter.com/brsyuksel

Singleton Tasarım Deseni

Yavaş yavaş tasarım desenleri üzerinde çalışmaya başlamışken Singleton tasarım deseni için yazdığım örnekleri paylaşmak istedim. Burda paylaşacağım örneklerde genel kullanım için uygun olanın varyasyonlarını yazmış olsam da aslen Singleton Tasarım Deseni prosedürüne tam olarak uymuyor.

İlk olarak miras alarak kullanabileceğiniz, sadece amaca odaklanmış bir Singleton

  1. class Singleton(object):
  2.     _instance = None
  3.     def __new__(cls,*args,**kwargs):
  4.         if cls._instance is None:
  5.             cls._instance = super(Singleton,cls).__new__(cls,*args,**kwargs)
  6.         return cls._instance
  7.  
  8. class Deneme(Singleton): pass
  9.  
  10. x = Deneme()
  11. y = Deneme()
  12.  
  13. x is y #True
  14. print x, y
  15. print id(x) , id(y)

İkinci olarak gene miras alarak kullanabileceğiniz, ancak örneği “özel” ( private ) bir nitelikte taşıyarak prosedüre daha uygun bir Singleton

  1. class Singleton2(object):
  2.     __instance = None
  3.     def __new__(cls,*args,**kwargs):
  4.         if getattr(cls,"_%s__instance" % cls.__name__, None) is None:
  5.             setattr(cls,"_%s__instance" % cls.__name__,
  6.             super(Singleton2,cls).__new__(cls,*args,**kwargs))
  7.  
  8.         return getattr(cls,"_%s__instance" % cls.__name__)
  9.  
  10. class Deneme(Singleton2): pass
  11.  
  12. x = Deneme()
  13. y = Deneme()
  14.  
  15. x is y #True
  16. print x, y
  17. print id(x), id(y)

Son olarak da Metaclass olarak kullanabileceğiniz bir Singleton

  1. class SingletonMetaClass(type):
  2.     def __init__(self,name,bases,dct):
  3.         super(SingletonMetaClass,self).__init__(name,bases,dct)
  4.         original_new = self.__new__
  5.  
  6.         def new_new(self,*args,**kwargs):
  7.             if getattr(self, "_%s__instance" % name, None) is None:
  8.                 setattr(self,"_%s__instance" % name,
  9.                 original_new(self,*args,**kwargs))
  10.             return getattr(self,"_%s__instance")
  11.  
  12.         self.__new__ = staticmethod(new_new)
  13.  
  14. class Deneme(object):
  15.     __metaclass__ = SingletonMetaClass
  16.  
  17. x = Deneme()
  18. y = Deneme()
  19.  
  20. x is y
  21. print x, y
  22. print id(x), id(y)

Ayrıca;
Ömer Ücel‘in paylaştığı, kullanımı ve anlaşılması kolay bir Singleton örneği
Metaclass __call__ metodu üzerinden çalışan bir Singleton ( benim yazdığıma oranla daha kolay anlaşır bir örnek )
Alex Martelli’nin Borg yöntemi ( Singleton’dan daha iyi bir performansa sahip olduğu söyleniyor ve daha kolay )
Ve tam amacına yönelik bir Singleton örneği ( Thread uygulamalarda güvenlik sağlıyor )
Son olarak Gary Robinson adındaki şahsın önce yazdığı Singleton örneğine sonra profil resmine bakınca karizmasıyla dudak uçuklatıp “Baba aşmış, baba coder; insan yazar, insan anlamaz, interpreter arada kalır” dedirten bir örnek

Tags: , ,
Posted in Python · Temmuz 21st, 2010 · Comments (0)

No comments yet

Leave a Reply

Bağlantılar

Etiketler

çember özel yöntem isimleri apache2screen apache2screen.deb bele kuvvet bi_rle4 brute-force classic classes classmethod descriptors getanurse ic.lnx icontacts ileri c programlama image imagedraw kaba kuvvet kelime tahmin libnotify math math.cos math.sin matruşka matryoshka memory leak mesafe metaclass mysqli new-style classes oauth php5 property pynotify Python singleton special method names staticmethod steganografi steganography super twittell TwittellOAuth wchar yeni stil sınıflar __mro__

Meta