preface

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 单例示例(对比参考)

template<class TYPE>
class Singleton {
public:
    static TYPE& instance() {
        static TYPE instance; // 函数内 static 局部变量
        return instance;      // 第一次调用时才构造,线程安全(C++11起)
    }
};

而你贴的代码用的是 static TYPE Instance类的静态成员变量),在程序加载时就已经构造,这才是饿汉式的核心特征。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐