一. 创建型模式
1. 单例模式
1.1 模块级别的单例模式
根据python的特性,推荐直接使用此方法
默认情况下,所有的模块都是单例,这是由python的导入行为所决定的
- 检查一个Python模块是否已经导入
- 如果已经导入,则返回改模块的对象。如果还没有导入,则导入该模块,并实例化。
- 因此当模块被导入的时候,它就会被初始化。
- 然而当同一个模块再次被导入的时候,它不会再次初始化,因为单例模式只能有一个对象,所以它会返回同一个对象。
class Config:
def __init__(self):
self.a = "a"
config = Config()
将config导出,config就是最简单的单例
1.2 经典单例模式
-
只允许Singleton 类生成一个实例
-
如果已经有一个实例了,会重复提供同一个对象
class Singleton:
def __new__(cls):
if not hasattr(cls, 'instance'):
cls.instance = super(Singleton, cls).__new__(cls)
return cls.instance
s = Singleton()
print(s)
s1 = Singleton()
print(s1)
# <__main__.Singleton object at 0x104d010a0>
# <__main__.Singleton object at 0x104d010a0>
通过覆盖__new__
方法,来控制对象的创建
方法hasttr(用于查看对象是否具有某个属性)用于查看对象cls是否具有属性instance,该属性的作用就是检查该类是否已经生成了一个对象。
当对象s1被请求的时候,hasattr()发现对象已经存在,所以对象s1将被分配已有的对象实例
1.3 懒汉式实例化
懒汉模式实例化是一种节约资源并仅在需要时才创建它们的方式
执行s = singleton()的时候,它会调用__init__
方法,但没有新的对象被创建。然而,实际的对象创建发生在调用Singleton.getInstance()的时候,我们正是通过这种方式来实现懒汉式实例化的
class Singleton:
__instance = None
def __init__(self):
if not Singleton.__instance:
print("__init__ method called..")
else:
print("Instance already created:", self.getInstance())
@classmethod
def getInstance(cls):
if not cls.__instance:
cls.__instance = Singleton()
return cls.__instance
s = Singleton()
print("Object created", Singleton.getInstance())
s1 = Singleton()
1.4 Monostate单例模式
class Borg:
__shared_state = {"1": "2"}
def __init__(self):
self.x = 1
self.__dict__ = self.__shared_state
pass
b = Borg()
b1 = Borg()
b.x = 4
print('b', b)
print('b1', b1)
print()
print('b', b.__dict__)
print('b1', b1.__dict__)
# 或者使用__new__实现Borg模式
class Borg(object):
_shared_state = {}
def __new__(cls, *args, **kwargs):
obj = super(Borg, cls).__new__(cls, *args, **kwargs)
obj.__dict__ = cls._shared_state
return obj
1.5 元类实现单例模式
class MetaSingleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(MetaSingleton, cls). __call__(*args, **kwargs)
return cls._instances[cls]
class Logger(metaclass=MetaSingleton):
pass
logger1 = Logger()
logger2 = Logger()
print(logger1, logger2)
1.6 装饰器
def singleton(cls):
_instance = {}
def inner():
if cls not in _instance:
_instance[cls] = cls()
return _instance[cls]
return inner
@singleton
class A:
def __init__(self):
pass
...