我会使用这样的单例:
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;
后一种方法具有可读的编译器错误消息的优点,但在调试模式下不是单例。