【问题标题】:Borg pattern or just module with functionsBorg 模式或只是具有功能的模块
【发布时间】:2010-11-22 17:22:49
【问题描述】:

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

【问题讨论】:

  • 使用一个模块,直到证明不是这样。

标签: python design-patterns


【解决方案1】:

在整个应用程序生命周期中,一个单例和一个模块仅代表一个实例。即使不需要此实例,也会保持实例化。

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

除此之外,子类化或模拟 borg 会容易得多。

【讨论】:

  • +1:“更容易继承或模拟博格”。其余的没有帮助。 Borg 可以在应用程序的持续时间内轻松创建,并且可以加载和删除模块以使其具有更短的生命周期。 “共享状态”是一种微妙之处,无助于澄清任何事情。坚持子类业务,这是有道理的。
【解决方案2】:

不同之处在于,在 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]

【讨论】:

    【解决方案3】:

    你能改用静态类吗? 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
    

    【讨论】:

      【解决方案4】:

      我有一个使用 borg 模式的用例:

      您不能将模块级别的函数定义为@property。如果你想要一些公共数据(比如配置)返回动态属性,你可以让它从 Borg 派生,然后编写属性方法。

      【讨论】:

        猜你喜欢
        • 2020-12-06
        • 1970-01-01
        • 2022-01-05
        • 1970-01-01
        • 2021-10-21
        • 2020-10-15
        • 1970-01-01
        • 2018-03-31
        • 1970-01-01
        相关资源
        最近更新 更多