实现单例模式的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    

 

posted @ 2019-10-14 16:36  yangzixiongh  阅读(178)  评论(0编辑  收藏  举报