Borg模式或只是带功能的模块

时间:2010-11-22 17:22:50

标签: python design-patterns

我正在考虑在我的项目中使用Singleton模式,因此我搜索了StackOverflow以找到实现它的pythonic方法。我发现this question的答案是“一个带有函数的模块(而不是一个类)可以很好地用作单例”。另一方面,第二个答案建议使用the Borg pattern。对我来说,使用模块是一个简单而直接的解决方案,所以我想了解何时使用Borg更可取。

4 个答案:

答案 0 :(得分:3)

不同之处在于,在Borg模式中,您将拥有不同的对象,其属性相同,而使用模块版本则会获得一个对象(模块)。

另外一个对象和一个模块略有不同:你不能挑选模块,但你可以挑选类。此外,您可以对对象进行操作(>,<,+, - 等)

有点偏离主题:通过一些修改,Borg模式可以用作一个非常简单的Multiton:

class Multiton(object):
    __shared_states = {}

    def __init__(self, name):
        if not self.__shared_states.has_key(name):
            self.__shared_states[name] = {}

        self.__dict__ = self.__shared_states[name]

答案 1 :(得分:3)

单例和模块仅代表一个实例,适用于所有应用程序生命周期。即使不需要,该实例也会被实例化。

borg模式是关于共享状态的。每个客户端类都将创建一个borg的新实例,但该实例将在不再需要时被处理 - 这是一种更优雅的方法。

除此之外,继承或模拟博格更容易。

答案 2 :(得分:1)

您可以使用静态类吗? SO Question

i.e.

class Test(object):
    i = 3 # class (or static) variable
    @classmethod
    def g(cls, arg):
        # here we can use 'cls' instead of the class name (Test)
        if arg > cls.i:
            cls.i = arg # would the the same as  Test.i = arg1

答案 3 :(得分:1)

我有一个用例,其中borg模式闪耀:

您无法在模块级别将函数定义为@property。如果你想要一些返回动态属性的常见数据(比如config),可以从Borg派生它,然后编写属性方法。