单例模式
简述
对于特定类只允许存在一个实例对象。
UML
python实现
class Singleton: _singleton = None def __new__(cls, *args, **kwargs): if not cls._singleton: cls._singleton = super(Singleton, cls ).__new__(cls, *args, **kwargs) return cls._singleton singleton1 = Singleton() singleton2 = Singleton() print(singleton1 is singleton2)
代码思路
每次创建对象时,先检查该类的实例对象是否存在,如果存在,则直接返回,
如果不存在,则直接调用父类的__new__方法创建新的对象实例并保持在类的属性中,
最后将其返回。
python是如何创建对象的?
首先调用__new__方法得到一个实例对象,
然后调用__init__方法去初始化这个实例对象,并将其返回。
这里还有一个细节,就是__new__方法的调用:
默认__new__方法会从子类开始一直调用父类的__new__方法,
直到调用object的__new__方法。
装饰器实现单例模式
def singleton_decorator(cls, *args, **kwargs): "单例装饰器" instance = {} def wrapper_singleton(*args, **kwargs): if cls not in instance: instance[cls] = cls(*args, **kwargs) return instance[cls] return wrapper_singleton @singleton_decorator class People: def __init__(self, name): self.name = name def print_name(self): print(self.name) p1 = People('tom') p2 = People('lily') print(p1 is p2) p1.print_name() p2.print_name()
应用场景
1.你希望这个类只有一个且只能有一个实例;
2.项目中的一些全局管理类(Manager)可以用单例来实现。