- 保证类仅有一个实例,并提供访问它的全局访问点;
- 唯一实例通过子类化可扩展;
- 用户无需更改代码即可使用该扩展实例;
- 由于不需要在每次调用都创建一个对象,可以节省内存以及动态产生销毁对象的开销。
实现1:基于继承
class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
orig = super(Singleton, cls)
cls._instance = orig.__new__(cls, *args, *kwargs)
return cls._instance
class MyClass(Singleton):
pass
- 对类进行实例化时会调用构造方法
__new__
,此时判断是否存在成员变量_instance
(单例):- 如
_instance
不存在,则创建类的实例、绑定到_instance上并返回; - 如
_instance
存在,则直接返回。
- 如
实现2:基于装饰器
def Singleton(cls):
instances = {}
def _singleton(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return _singleton
@Singleton
class MyClass:
pass
原理与实现1类似,改由instances
存放单例。
网友评论