为什么Borg pattern比Singleton pattern好?
我问是因为我看不出他们会有什么不同。
博格:
class Borg:
__shared_state = {}
# init internal state variables here
__register = {}
def __init__(self):
self.__dict__ = self.__shared_state
if not self.__register:
self._init_default_register()
单例:
class Singleton:
def __init__(self):
# init internal state variables here
self.__register = {}
self._init_default_register()
# singleton mechanics external to class, for example this in the module
Singleton = Singleton()
我想在这里显示的是,服务对象,无论是作为Borg还是Singleton实现的,都有一个非常重要的内部状态(它提供了一些基于它的服务)(我的意思是它必须是有用的,而不是仅仅为了好玩才使用Singleton/Borg)。
这个状态必须被初始化。这里,单例实现更加简单,因为我们将init视为全局状态的设置。我觉得很尴尬的是,Borg对象必须查询它的内部状态,看看它是否应该自我更新。
你的内心状态越糟。例如,如果对象必须侦听应用程序的拆卸信号以将其寄存器保存到磁盘,则该注册也只应进行一次,对于单例对象,这更容易。
博格与众不同的真正原因归结于子类化。
如果将一个borg子类化,则子类的对象与其父类对象具有相同的状态,除非显式重写该子类中的共享状态。singleton模式的每个子类都有自己的状态,因此将生成不同的对象。
同样在singleton模式中,对象实际上是相同的,而不仅仅是状态(尽管状态是唯一真正重要的东西)。
在python中,如果您想要一个可以从任何地方访问的唯一“对象”,只需创建一个只包含静态属性的类
Unique
、@staticmethod
s和@classmethod
s;您可以将其称为唯一模式。在这里,我实现并比较了3种模式:独特的
单重态
博格
测试
输出:
在我看来,Unique实现是最简单的,然后是Borg,最后是Singleton,它的定义需要两个函数的数量非常难看。
不是的。通常不推荐的是python中这样的模式:
使用类方法来获取实例而不是构造函数。Python的元编程允许更好的方法,例如Wikipedia上的方法:
相关问题 更多 >
编程相关推荐