单例模式是一种常用的软件设计模式,核心结构是只包含一个被称为单例类的特殊类,通过单例模式可以保证系统中只有一个实例而且该实例易于外界访问,从而控制实例数量来保证系统资源的节省。可以用于打印任务,以及类中实例只有一个的情况下。单例模式设计的类只能实例,单例的四种方法要了解,类的call方法要能默写。
1 使用new 方法, 注意的是多线程无法支持这种方法创建的单例,因此要加锁,第一次判断是否单例对象,第二次判断是解决多线程下的问题。 推荐使用
import threading class Singleton(object): lock = threading.Lock() def __new__(cls,*args,**kw): if not hasattr(cls,'_instance'): with Singleton.lock: if not hasattr(Singleton, "_instance"): cls._instance = object.__new__(cls) return cls._instance class MyClass(Singleton): print(1) MyClass()
2 共享属性
class Dic(object): _state = {} def __new__(cls,*args,**kw): obj = super().__new__(cls,*args,**kw) obj.__dict__ = cls._state return obj class MyClass(Dic): pass MyClass()
3 装饰器
def Singleton(cls): state = {} def wapper(*args,**kw): if cls not in state: state[cls] = cls(*args,**kw) return state return wapper @singleton class My_Singleton: pass
4 import
# Singleton.py class My_Singleton(): def foo(self): pass # use.py from Singleton import My_Singleton My_Singleton.foo()
class My_Singleton(type): def __call__(cls,*args,**kw): if not hasattr(cls,'_instance'): cls._instance = super().__call__(*args,**kw) return cls._instance class My_Class(metaclass=My_Singleton): def __init__(self, name): self.name = name print(My_Class('123')) print(My_Class('456'))