这个单例有什么问题?

1 投票
5 回答
702 浏览
提问于 2025-04-17 00:24

目前我在使用一种相对简单的单例模式实现。不过,我在网上从没见过类似的建议,这让我觉得可能有什么问题...

class Singleton:
    def __init__():
        raise ...

    @staticmethod
    def some():
        pass

    @staticmethod
    def another():
        pass

这种单例实现(把所有类成员都设为静态)有什么缺点吗?它有点像把模块当作单例使用,只不过是把所有东西都放在一个类里。


编辑:我知道在Python中还有其他实现单例的方法。我不喜欢它们的原因是,没有一个方法是明确的(这与Python的哲学相悖):

因为我用的是 a = Class() 而不是像 a = Class.Instance() 这样的写法,所以不明显我在处理一个有共享状态的对象(见注释#1)。如果所有成员都是静态的,至少我可以用 Class.someMethod() 来暗示它是一个单例。我不喜欢这个方法的原因是,不能使用构造函数和析构函数,这就失去了单例相比于自由函数的一个主要优势,那就是可以在创建和销毁时做一些事情(见注释#2)。

注释#1:我知道我不应该关心单例的状态(如果我关心,那它根本就不应该是单例)。但我还是希望能明确它是什么类型的类。

注释#2:当你创建一个单例时,可以在它的构造函数中做一些初始化。例如,在一个处理图形库的单例中,可以在构造函数里初始化这个库。这样,单例的构造函数和析构函数就会自动处理初始化和销毁的事情。
或者在一个资源管理器中:析构函数可以检查在它被销毁时内存中是否还有资源,并相应地采取行动。
如果你使用自由函数而不是单例,你就得手动完成所有这些工作。

5 个回答

1

这东西没法模拟,所以测试起来很困难。

这就是它的问题所在。

实际上,拥有一个可以测试的类的对象被认为是更好的做法。

2

这不是一个单例模式。它是一个无状态的全局方法集合,封装在一个类型里面。

这样做没有什么本质上的问题,前提是你不要认为它是单例。

单例模式的意思是只能有一个实例。

11

没错,这个是单例模式,这就是它的问题。如果你打算把所有的方法都设为静态的,那就没必要搞一个类了,直接用普通的函数就行了。

撰写回答