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
相关阅读 更多 +












