C++ 单例模式 vs 静态方法

7

可能重复:
C++单例模式与完全静态对象

你好,

为什么我应该选择单例模式而不是静态类方法。

    MoneyPrinter::addJob(PrinterJob &job);
or
    MoneyPrinter::getInstance().addJob(PrinterJob &job);

这只是一个风格问题吗? 你使用什么?为什么?

附注:我知道默认情况下单例模式不是线程安全的(第一次初始化)。


谁说你应该偏爱他们? - David Heffernan
我同意这个重复问题,但是那里从来没有得到答案。 - Edward Strange
我认为单例模式示例中有一个拼写错误:MoneyPrinter::GetInstance().addJob(PrinterJob &job); - T33C
4个回答

5

为什么我应该选择单例而不是静态类方法

单例可以有内部状态(例如在您的示例中,已添加作业列表),即单例类的成员数据。

你使用什么?为什么?

如果没有状态,则使用静态方法,因为这是最简单的。

否则,使用单例,最好是静态初始化(而不是按需或运行时初始化)。


8
你可以使用静态方法来定义状态,这只是静态变量的另一种形式。 - Billy ONeal
2
如果没有状态,为什么要在一个没有“一切都必须在类中”的狂热的语言中创建仅包含静态方法的类,而这些方法永远不会被实例化?只需将其作为一堆函数放在适当的命名空间中即可。 - user395760
@Billy ONeal - 如果有静态变量需要实例化,那么它们类似于单例模式,我更喜欢在单例类中将它们分组在一起。 - ChrisW
1
@delnan:我同意你的观点。我的观点仅仅是这样的事情是可能的。@Chris:那么这与在类上简单地拥有静态字段有什么区别呢? - Billy ONeal
1
@Billy ONeal - 将它们作为成员数据确保它们在单例实例化时大致同时构造。 单例的另一个优点是它可以是超类/子类,其确切类型直到实例化才定义。 - ChrisW
@ChrisW:很公平。+1 - Billy ONeal

3
一个单例模式可以让你控制类何时被实例化,正如DeadMG所指出的那样,你可以选择是否要实例化它。静态类则不太可控,并且在main函数调用之前就已经被实例化了。
当单例依赖于某些在main函数调用之前不可用的其他类或资源时,类实例化的顺序有时可能是关键的。
正如你提到的,如果从多个线程中调用单例,你需要确保你使用了一个线程安全的单例。例如,Scott Meyer(来自Effective C++)的单例模式就不是线程安全的。

1
您始终可以在静态“单例”实现文件中操作任何机密的静态数据。实际上,您可以使用完整的类结构,那么各种单例和此静态内容之间的区别纯粹是语法上的。 - Edward Strange
@Noah - 我认为这些差异也是语义上的,giowck提出了一个很好的问题,因为两种方法都应该被考虑和理解。 - T33C

2

如果您使用静态成员函数,由于使用的语法,更难将Singleton-ness重构出来。这是其中一个原因。


1
单例模式的一般规则是,如果你必须要问,就不要使用它。这对于任何全局可变状态都是正确的。

喜欢这个规则。虽然简短,但非常真实和重要。 - user395760
15
-1 是因为它根本没有回答问题。 - Edward Strange

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接