我会像这样使用单例:
Singleton* single = Singleton::instance();
single->do_it();
我会用一个未命名的类来做这件事:
single.do_it();
我觉得单例模式除了具有可读的错误消息之外,没有比未命名类更大的优势。使用单例比使用未命名类对象更加笨拙:首先,客户端必须先获取实例的句柄;其次,实现者Singleton::instance()
可能需要考虑并发问题。
那么,为什么会选择单例模式,而不是匿名类?
附言,尽管未命名类的明显定义可能是
class {
// ...
}single;
我也可以这样定义它:
#ifndef NDEBUG
class Singleton__ { // readable error messages,
#else
class { // unnamed, clients can t instantiate
#endif
// ...
}single;
后一种方法具有易读的编译器错误消息的优点,但在 Debug 模式下不是单例。