Think in Python Design Pattern -- Singleton
时间:2011-05-22 来源:pyzend
可能最简单的设计模式就是单件模式--提供一个单一的实例给特定的类,主要是控制对象实例的生成。
1.一个最简单的方法是提供一个内部的嵌套类来实现单件模型代理
class OnlyOne: class __OnlyOne: def __init__(self, arg): self.val = arg def __str__(self): return `self` + self.val instance = None def __init__(self, arg): if not OnlyOne.instance: OnlyOne.instance = OnlyOne.__OnlyOne(arg) else: OnlyOne.instance.val = arg def __getattr__(self, name): return getattr(self.instance, name)
使用了 非直接访问类__OnlyOne的默认构造器来控制OnlyOne实例的生成。__getattr__()代理访问实例的属性。
使用例子:
x = OnlyOne('sausage') print x y = OnlyOne('eggs') print y z = OnlyOne('spam') print z print x print y print `x` print `y` print `z` output = ''' <__main__.__OnlyOne instance at 0076B7AC>sausage <__main__.__OnlyOne instance at 0076B7AC>eggs <__main__.__OnlyOne instance at 0076B7AC>spam <__main__.__OnlyOne instance at 0076B7AC>spam <__main__.__OnlyOne instance at 0076B7AC>spam <__main__.OnlyOne instance at 0076C54C> <__main__.OnlyOne instance at 0076DAAC> <__main__.OnlyOne instance at 0076AA3C> ''' #:~
以上代码实现了单件模式,但遇到多线程(进行)应用时会问题,因为它限制了“共享对象”池的使用,以下是共享对象池的实现版本:
singleton_2.py
class __OnlyOne: def __init__(self): self.val = None def __str__(self): return 'self' + self.val instance = None def __new__(cls): if not OnlyOne.instance: OnlyOne.instance = OnlyOne.__OnlyOne() return OnlyOne.instance def __getattr__ (self, name): return getattr(self.instance, name) def __setattr__ (self, name): return setattr(self.instance, name)
2. 可重用的Singleton
Alex Martelli的'Borg'类:
通过设定__dict__实例属性来达到共享实例的目地。
singleton_Borg.py
相关阅读 更多 +