实现单例模式的5中方法
使用类简单实现
1 class Singleton(object): 2 def __init__(self): 3 pass 4 5 def instance(cls, *args, **kwargs): 6 if not hasattr(Singleton, '_instance'): 7 Singleton._instance = Singleton(*args, **kwargs) 8 return Singleton._instance
缺点:多线程时会出错。例如:当两个线程启动时同时检测到Singleton没有_instance时,两个线程会同时创建两个实例。
改进:加锁
1 class Singleton(object): 2 def __init__(self): 3 pass 4 5 def instance(cls, *args, **kwargs):
#加锁
lock()
6 if not hasattr(Singleton, '_instance'): 7 Singleton._instance = Singleton(*args, **kwargs)
#解锁
unlock()
8 return Singleton._instance
缺点:加锁 效率降低。且若已经有实例对象那么就不需要再加锁。
改进:双重判断。
class Singleton(object): def __init__(self): pass def instance(cls, *args, **kwargs): if not hasattr(Singleton, '_instance'): lock()#加锁 if not hasattr(Singleton, '_instance'): Singleton._instance = Singleton(*args, **kwargs) unlock()#解锁 return Singleton._instance
缺点:该方法只能通过Singleton.instance()创建出单例对象。通过Singleton()创建出的对象不是单例对象。
改进:使用__new__方法
class Singleton(object): def __init__(self): pass def __new__(cls, *args, **kwargs): if not hasattr(Singleton, '_instance'): lock()#加锁 if not hasattr(Singleton, '_instance'): Singleton._instance = object.__new__(cls) unlock()#解锁 return Singleton._instance