【发布时间】:2011-04-19 22:54:41
【问题描述】:
假设我们只需要在我们的项目中拥有某个类的一个实例。有几种方法可以做到这一点。
我想比较一下。请你复习一下我的理解。
1) 经典单例模式
2) 完全静态的类(所有方法和成员都是静态的)。
据我了解,差异如下:
a) 未定义跨不同单元的静态成员的初始化顺序。 因此,完全静态成员初始化不能使用来自其他模块的任何静态成员/函数。而单例则没有这个问题。
b) 我们必须为 Singleton 的 getInstance() 处理线程。但是,完全静态的类没有这个问题。
c) 对方法的访问看起来有点不同。 Foo::bar(); vs Foo::getInstance()->bar(); 一般情况下单例可以返回NULL,表示对象构造有问题,而静态类不能。
d) 类的定义看起来有点笨拙,有一堆静态类的静态变量。
我错过了什么吗?
【问题讨论】:
-
然后有选项(3) 只需创建对象的一个实例。 真的,仅此而已。如果你只需要一个实例,为什么只创建一个实例这么难?使用 C++ 编写代码时,您创建的对象是否通常比您需要的多?
-
单例是否会在连续调用
getInstance()时返回不同的值?如果不是,那么关注 (c) 就没有实际意义,因为调用看起来不像Foo::getInstance()->bar();;它看起来像块开头的单个Foo* foo(Foo::getInstance());和之后的foo->bar();。 -
@James McNellis - 如果他真的对
getinstance()有线程问题,那么他在同步创建他的一个实例时也会遇到同样的问题。如果没有逻辑所有者,您将一个实例放在哪里?你可以创建一个,但是如果你这样做并且解决了创建线程问题,你基本上已经滚动了一个单例。 -
@T.E.D.你错过了重点:詹姆斯说没有必要尝试通过某种模式来强制唯一性,当你可以在某个地方创建一个对象而不强制任何东西(比如说,在
main,在线程之前)并完成它。
标签: c++ class static singleton