这个单例有什么问题?
目前我在使用一种相对简单的单例模式实现。不过,我在网上从没见过类似的建议,这让我觉得可能有什么问题...
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 个回答
这东西没法模拟,所以测试起来很困难。
这就是它的问题所在。
实际上,拥有一个可以测试的类的对象被认为是更好的做法。
这不是一个单例模式。它是一个无状态的全局方法集合,封装在一个类型里面。
这样做没有什么本质上的问题,前提是你不要认为它是单例。
单例模式的意思是只能有一个实例。
没错,这个是单例模式,这就是它的问题。如果你打算把所有的方法都设为静态的,那就没必要搞一个类了,直接用普通的函数就行了。