单例模式是23种设计模式中的一种:通常情况下,类每实例化一次便产生一个新的对象。在某些场景下,只需要保存一个实例即可,这样可以节省内存
它的特点是:
- 1、单例类只能有一个实例。
- 2、单例类必须自己创建自己的唯一实例。
- 3、单例类必须给所有其他对象提供这一实例。
class Singleton(object):
instance = None
lock = threading.Rlock()
def __new__(cls, *args, **kwargs):
if cls.instance:
return cls.instance
with cls.lock:
if not cls.instance:
cls.instance = object.__new__(cls)
return cls.instance
为什么这样写呢?
它的思路是:重写__new__方法,如果实例已经存在,直接返回实例,如果不存在,就__new__一个实例。
假如我们在Singleton中定义了__init__方法,那么每次实例化对象时,类的属性都会被初始化一次,也就会导致属性覆盖。
加锁,是因为当多线程时,不加锁仍然会创建多个实例,但不能一律用锁,而是先判断,如果已经有实例了,直接返回实例即可,没必要再进行一次加锁。