1、什么情况下使用单例模式
- 当每个实例都会占用资源, 而且实例初始化会影响性能, 这个时候可以考虑使用单例模式, 好处就是只实例化一次, 只需要初始化一次
- 当有同步需要的时候, 可以通过一个实例来进行同步控制, 比如对某个共享文件(如 日志文件)的控制, 对计步器的控制
2、装饰器实现单例模式
def singleton(cls):
#实例字典
instance_dict = {
}
@wraps(cls) # 防止使用装饰器后,函数名的改变
def new_cls(*args,**kwargs):
#获得源类的属性,对类名、参数列表都一样,只创建一个这样的实例
key = '{}_{}_{}'.format(cls.__name__,args,kwargs)
print(key,cls(*args,**kwargs))
print(cls)
if key not in instance_dict:
instance_dict[key] = cls(*args, **kwargs)
return instance_dict[key]
return new_cls