eager饿汉式、Meyers懒汉式单例模式

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类的静态成员变量 ),在程序加载时就已经构造,这才是饿汉式的核心特征。