【发布时间】:2013-07-16 17:26:53
【问题描述】:
我已经阅读了很多关于单例、何时应该使用和不应该使用它们以及如何安全地实现它们的信息。我正在用 C++11 编写,并且遇到了 Meyer 的单例延迟初始化实现,如 this question.
所示这个实现是:
static Singleton& instance()
{
static Singleton s;
return s;
}
我了解这对于 SO 上的其他问题来说是线程安全的,但我不明白这实际上是一个单例模式。我已经用其他语言实现了单例,这些总是以Wikipedia 中的这个例子结束:
public class SingletonDemo {
private static volatile SingletonDemo instance = null;
private SingletonDemo() { }
public static SingletonDemo getInstance() {
if (instance == null) {
synchronized (SingletonDemo .class){
if (instance == null) {
instance = new SingletonDemo ();
}
}
}
return instance;
}
}
当我查看第二个示例时,非常直观地知道这是一个单例,因为该类拥有对自身一个实例的引用,并且只返回该实例。但是,在第一个示例中,我不明白这如何防止存在该对象的两个实例。所以我的问题是:
- 第一个实现如何强制执行单例模式?我认为它与 static 关键字有关,但我希望有人可以深入向我解释幕后发生的事情。
- 在这两种实现方式之间,哪一种更可取?有什么优缺点?
感谢您的帮助,
【问题讨论】:
-
C++ 代码,您表示它的方式,与其说是一个单例,不如说它是一个初始化良好的全局对象。没有什么能阻止你拥有另一个(制作另一个功能),这很好。强迫任何人做任何事是没有意义的。如果你只想要一个,就只做一个。
-
static Singleton s;表示第一次调用函数时,该变量将被初始化,与非静态变量不同,函数结束后它不会被销毁。因此,当您再次调用它时,它仍然存在,因此第二次(第 3 次,第 4 次,...)时间执行的唯一指令是 return s。 -
我认为
Singleton的构造函数是私有的,因此实际获取实例的唯一方法是通过instance()函数。 -
单身人士:只需说no(另外,您的第一个示例本身并不是单身人士。您遗漏了一些代码。)
-
我完全不知道为什么这会被关闭为“主要基于意见”。好的,第二个问题可能看起来很像,但很可能(并且实际上是)客观原因更喜欢一个实现而不是另一个,第一个问题虽然缺乏对
static关键字的理解,但它是一个完全有效的问题, 也。这不仅仅是那些单身的仇恨者尖叫着要血。说真的,我也是其中之一,但这也不会使这个问题无效。 +1
标签: c++ design-patterns c++11 singleton