几种实现单例模式的方法
所谓的单例模式就是一个类只有一个实例,所有的引用(实例 和对象)拥有相同的(属性和方法)
单例模式的要点
1.某个类只有一个实例
2.它必须自行创造这个实例
3.它必须自行向整个系统提供这个实例
实现要点
1.单例模式中的类只提供所有的构造函数
2.类定于中含有该类的静态私有对象
3.该类的提供一个静态的私有函数用于创建和获取本省的静态私有对象
第一 装饰器方法
def singleton(cls,*args,**kwargs):
instaces = {}
def _singleton():
if cls not in instaces:
instaces[cls] = cls(*args,**kwargs)
return instaces[cls]
return _singleton
@singleton
class Myclass(object):
a = 1
def __init__(self,x=0):
self.x = x
one = Myclass()
two = Myclass()
one.a = 3
print(two.a)
print(one.a is two.a)
第二种 __dict__属性的方法
class Borg(object):
_state = {}
def __new__(cls,*args,**kwargs):
ob = super(Borg,cls).__new__(cls,*args,**kwargs)
ob.__dict__ = ob._state
return ob
class Myclass(Borg):
a = 1
one = Myclass()
two = Myclass()
one.a = 3
print(two.a)
print(one.a is two.a)
第三种方法
讲类的实例绑定到类的变量_instaces上
class singleton(object):
def __new__(cls,*args,**kwargs):
if not hasattr(cls,'_instaces'):
orig = super(singleton,cls)
cls._instaces = orig.__new__(cls,*args,**kwargs)
return cls._instaces
class Myclass(singleton):
a = 1
one = Myclass()
two = Myclass()
one.a = 3
print(two.a)
print(one.a is two.a)