文章目录
Python设计模式
1 单例模式(Singleton)
https://zhuanlan.zhihu.com/p/37534850
1.1 单例模式是什么
单例是一种设计模式,应用该模式的类只会生成一个实例。
单例模式保证了类在不同程序之间只会生成一个实例,即多个不同的程序每次调用这个类,都只会取到同一个对象实例。如果实例不存在,则创建一个实例,如果存在,则返回这个实例。
因为单例是一个类,可以为其提供编写相应的操作来实现管理这个实例。
单例模式的类只保证了一个实例存在,相当于整个系统只拥有一个全局对象,这样有利于我们协调系统整体的行为。
1.2 为什么要使用单例模式
防止资源混乱。相对于全局变量,在小规模场景下,还是很方便。不过如果代码规模量大,并且有很多文件的时候,使用全局变量就会使代码变得难以管理。你可能不知道在哪个文件中或其他代码中定义了相同类型甚至是相同名字的全部变量,这样会导致变量重名的问题。
所以可以使用单例模式去管理。
1.3 单例模式应用场景
- 1 服务器配置信息:
- 在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象去获取这些配置信息。这种方式简化了在复杂环境下的配置管理。
1.4 单例模式的优缺点
https://www.cnblogs.com/restartyang/articles/7770856.html
1.5 四种方式实现单例模式
1.5.1 函数装饰器实现单例模式
def singleton(cls):
_instance = {}
def inner():
if cls not in _instance:
instance[cls] = cls()
return _instance[cls]
return inner
@singleton
class Cls():
def __init__(self):
pass
c1 = Cls()
c2 = Cls()
print(id(c1)==id(c2))
1.5.2 类装饰器实现单例模式
class Singleton():
def __init__(self,cls):
self._cls = cls
self._instance = {}
def __call__(self):
if self._cls not in self._instance:
self._instance[self._cls] = self._cls()
return self._instance[self._cls]
@Singleton
class Cls():
pass
cls1 = Cls()
cls2 = Cls()
print(cls1,cls2)
1.5.3 使用__new__
方法实现单例模式
class Singleton(object):
_instance = None
def __new__(cls,*args,**kwargs):
if cls._instance is None:
cls._instance = object.__new__(cls,*args,**kwargs)
return cls._instance
def __init__(self):
pass
single1 = Singleton()
single2 = Singleton()
print(id(single1) == id(single2))
1.5.4 使用metaclass实现单例模式
先了解type创建类
def func():
print('do something')
Klass = type('Klass',(),{'func':func})
k = Klass()
k.func()
使用metaclass方式
class Singleton(type):
_instance = {}
def __call__(cls,*args,*kwargs):
if cls not in cls._instance:
cls._instance[cls] = super(Singleton,cls).__call__(*args,**kwargs)
return cls._instance[cls]
class Cls(metaclass=Singleton):
pass
cls1 = Cls()
cls2 = Cls()
print(id(cls1) == id(cls2))