Borg模式还是只是带函数的模块

4 投票
4 回答
770 浏览
提问于 2025-04-16 07:27

我在考虑在我的项目中使用单例模式,所以我在StackOverflow上搜索了一下,想找一种适合Python的实现方法。我发现了这个问题,其中有个被接受的回答说“一个包含函数的模块(而不是类)可以很好地作为单例使用”。另一方面,第二个回答建议使用博格模式。对我来说,使用模块是一个简单直接的解决方案,所以我想了解一下在什么情况下使用博格模式更好。

4 个回答

2

你能不能用静态类来代替呢? 这是一个相关的问题

也就是说

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

这段话的意思是,Borg模式和模块的区别在于,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

单例模式和模块在整个应用程序的生命周期内只会有一个实例。这种实例会一直存在,即使在不需要的时候也不会消失。

而博格模式则是关于共享状态的。每个使用这个博格的类都会创建一个新的实例,但当这个实例不再需要时,它会被销毁——这种方式更优雅。

除此之外,使用博格模式更容易进行子类化或模拟。

撰写回答