Python设计模式-孤例模式(Singleton)及Borg模式
孤例模式(Singleton)及在python中的进化版Borg模式
目的:传统孤立模式(Singleton) 保障了程序在不同位置都可以且仅可以取到同一个对象实例,即一个类仅最多存在一个实例。Borg模式通过保障同类的所有实例共享所有数据,达到了相同的目的。
传统孤立模式的实现方法很多,如装饰器、metaclass,也可以直接在类的定义中修改。
示例(Singleton)
# 装饰器版本
def singleton(cls):
_instance = {}
def inner():
if cls not in _instance:
_instance[cls] = cls()
return _instance[cls]
return inner
@singleton
class MySingleton1(object):
def __init__(self):
pass
# 直接在类定义中修改
class MySingleton2:
_INSTANCE = None
def __new__(cls, *args, **kwargs):
'''通过重定义__new__,实现创建时对是否已存在实例进行判别。'''
if not cls._INSTANCE:
cls._INSTANCE = super(MySingleton, cls).__new__(cls, *args, **kwargs)
return cls._INSTANCE
def __init__(self, *args, **kwargs):
pass
Borg模式将全部实例,与子类的全部实例。共用同一个__dict__。这样保证了所有实例状态的一致性。这同样属于单例模式的理念。在python中,建议使用Borg模式来达到Singleton的目的。
示例(Borg)
class Borg(object):
__shared_state = {}
def __new__(cls, *args, **kwargs):
self = object.__new__(cls, *args, **kwargs)
# 通过这种方式, 所有Borg的子类,都共享了__shared_state
self.__dict__ = cls.__shared_state
class YourBorg(Borg):
def __init__(self, state=None):
pass
# 装饰器版本
def borg(cls):
cls._state = {}
orig_init = cls.__init__
def new_init(self, *args, **kwargs):
self.__dict__ = cls._state
orig_init(self, *args, **kwargs)
cls.__init__ = new_init
return cls
@borg
class YourBorg:
pass
ref
https://www.jb51.net/article/167223.htm
https://blog.csdn.net/leongongye/article/details/47132057
本文来自博客园,作者:坦先生的AI资料室,转载请注明原文链接:https://www.cnblogs.com/yushengchn/p/16478427.html

浙公网安备 33010602011771号