preface
c
template<class TYPE>
class Singleton
{ public: //global access point
static TYPE *instance()
{ return &Instance; };
public:
//constructor
Singleton()
{ }
//destructor
virtual ~Singleton()
{ }
private:
//instance for TYPE
static TYPE Instance;
};
这是典型的饿汉式(eager)单例------对象在 main 之前就构造好了,区别于 Meyers 单例(函数内 static 局部变量,懒汉式、第一次调用才构造)。"
"(函数内 static 局部变量,懒汉式、第一次调用才构造)"是饿汉式还是Meyers式单例的特点
一、eager饿汉式和Meyers懒汉式单例模式
| 名称 | 特点 | 示例 |
|---|---|---|
| 饿汉式(Eager) | 程序启动时(main 之前)就构造好,用 静态成员变量 实现 |
你贴的那段 static TYPE Instance; |
| 懒汉式 / Meyers 单例 | 第一次调用时才构造 ,用 函数内 static 局部变量 实现 | 见下方代码 |
"函数内 static 局部变量,懒汉式、第一次调用才构造"是 Meyers 单例的特点,不是饿汉式的特点。
原文那句话的意思是:
Meyers 单例(函数内 static 局部变量,懒汉式、第一次调用才构造)
括号里的三个描述,全部都是在说 Meyers 单例,用来和前面的饿汉式做对比,而不是说饿汉式具有这些特点。只是原文的括号位置容易让人误读。
Meyers 单例示例(对比参考)
cpp
template<class TYPE>
class Singleton {
public:
static TYPE& instance() {
static TYPE instance; // 函数内 static 局部变量
return instance; // 第一次调用时才构造,线程安全(C++11起)
}
};
而你贴的代码用的是 static TYPE Instance(类的静态成员变量 ),在程序加载时就已经构造,这才是饿汉式的核心特征。