单例模式——C++模板实现

单例模式很简单,也很常用,但是在各个具体语言中的实现方式又有很多值得考究的细节;

Java里有懒汉式(延迟实例化)、饿汉式(提前实例化),再加上线程安全,能做的很复杂;

C++里也有“局部静态变量”的妙用,也有一堆默认构造函数(默认构造函数、拷贝构造函数、重载赋值符号)需要私有化的麻烦;

每次要将一个类做成单例的时候,都要私有化一堆构造函数,再增加一个获取实例的静态方法,确实比较麻烦;

所以可以利用C++强大的模板编程(编译期多态),实现一个单例模板:

[cpp]  view plain copy
  1. #ifndef SINGLETON_H  
  2. #define SINGLETON_H  
  3.   
  4. /** 
  5.  * tips: C++ Template Class 
  6.  * 需要将与模板类型T相关的实现全部放在头文件中 
  7.  * 这样编译器才能在编译期将所有的模板类型替换 
  8.  */  
  9.   
  10. template<typename T>  
  11. class Singleton  
  12. {  
  13. private:  
  14.     Singleton() {}  
  15.     Singleton(const Singleton &);  
  16.     Singleton & operator = (const Singleton &);  
  17.   
  18. public:  
  19.     static T * getInstance()  
  20.     {  
  21.         //局部静态变量,延时初始化,并一直保有该实例  
  22.         //程序退出时,可以保证调用实例的析构方法释放资源  
  23.         static T instance;  
  24.         static T *pt = &instance;  
  25.         return pt;  
  26.     }  
  27.   
  28. };  
  29.   
  30. #endif // SINGLETON_H  

这样,使用的时候只需要将具体的类塞进该模板即可:

[cpp]  view plain copy
  1. //singleton  
  2. Singleton<MySingleton>::getInstance()->test();  

Tips:不要忽略细节与其所以然!

细节1:

C++ Template Class 需要将与模板类型T相关的实现全部放在头文件中;
这是因为编译器需要在编译期将所有的模板类型替换成具体类型;

细节2:
注意局部静态变量的初始化时机与生命周期;
注意设计单例时,能够在程序退出时,释放单例所占用的资源——这里利用局部静态变量的析构方法来释放资源;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值