一.理解单例模式
单例模式是一种创建型设计模式,它确保一个类有且只有一个特定类型的对象,并提供全局访问点。其意图为:
确保类有且只有一个对象被创建
方法实现的单例模式
:
:
hasattr(cls,):
cls.instance=super(Singleton,cls).__new__(cls)
cls.instance
a=Singleton()
b=Singleton()
print(a)#
print(b)#
new方法为python实例化创建对象自动执行的函数,通过重写这个函数,使之先判断该类中是否有instance属性(利用反射),若没有则为创建一个对象并为该属性赋值,最后返回instance中的对象。通过这种方式我们实现了每次创建实例返回的都是类中的instance的值。
2.懒汉式实例化
:
__instance=:
:
cls.__instance:
cls.__instance = Singleton()
cls.__instance
a=Singleton.getInstance()#
b=Singleton.getInstance()#
print(a)
print(b)
我觉得这种方式最好理解,感觉像是手动完成单例创建逻辑,但注意获得实例一定要调用Singleton.getInstance()方法,直接a=Singleton()相当于没用单例。
3.基于元类的单例实现
:
__instance={}
:
self MetaSingleton.__instance:
MetaSingleton.__instance[self] = super(MetaSingleton,self).__call__()
MetaSingleton.__instance[self]
class Singleton(metaclass=MetaSingleton):
def init(self):
pass
a=Singleton()#
b=Singleton()#
print(a)
print(b)
执行Singleton()之后,首先会调用MetaSingleton中的call函数,如果Singleton类没有在instance中,则为其创建一个实例,也就是正常调用type中的call函数,将返回的对象存在instance中,以该类名为键,对象为值,最后返回这个对象,若instance中有该类,那就直接返回存储的对象。
这种方式我觉得较好,不用为每个类单独创建单例模式,只需将元类重写即可
三.单例模式的缺点
全局变量可能在某处被修改,但开发人员仍然认为他们没有发生变化
:
_shared_state={}
:
self.x=self.__dict__=self._shared_state
a=Monostate()
b=Monostate()
b.x=5
print(a)#
print(b)#
print(a.x)#5
a.c=4
print(b.c)#4
这里的实现方式为利用类中的dict方法,我感觉是将_shared_state赋给dict后,每个对象的dict的地址都是相同的,所以对象的属性存储的位置都相同,那么一个对象的属性变化,其余的属性也会发生变化。