Python设计模式-孤例模式(Singleton)及Borg模式

孤例模式(Singleton)及在python中的进化版Borg模式

目的:传统孤立模式(Singleton) 保障了程序在不同位置都可以且仅可以取到同一个对象实例,即一个类仅最多存在一个实例。Borg模式通过保障同类的所有实例共享所有数据,达到了相同的目的。

传统孤立模式的实现方法很多,如装饰器、metaclass,也可以直接在类的定义中修改。

返回 Python设计模式-outline

示例(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

posted @ 2022-07-14 17:00  坦先生的AI资料室  阅读(354)  评论(0)    收藏  举报