Singleton(单件) — 对象创建型模式
保证一个类仅有一个实例,并提供一个访问他的全局访问点。
适用场景
- 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
效果
- 对唯一实例的受控访问:因为 Singleton 类封装它的唯一实例,所以它可以严格地控制客户怎样以及何时访问它。
- 缩小名字空间:Singleton 模式是对全局变量的一种改进,它避免了那些存储唯一实例的全局变量污染名字空间。
- 允许可变数目的实例:可以控制实例的个数。
UML图
示例
class Foo(object):
instance = None
def __init__(self):
pass
def __new__(cls, *args, **kwargs):
if Foo.instance:
return Foo.instance
else:
Foo.instance = object.__new__(cls, *args, **kwargs)
return Foo.instance
client
obj1 = Foo()
obj2 = Foo()
print(obj1, obj2)
"""
output:
<__main__.Foo object at 0x000001E334C23908> <__main__.Foo object at 0x000001E334C23908>
"""
注意:由于 Python 有GIL(全局解释锁),一次只允许使用一个线程执行 Python 字节码,所以不用加锁。但其他语言如C++在实现时则需要注意!