c++单例模式初探

在cocos2d-x中看到了大量的单例模式,于是学习了一下c++的单例模式。
单例模式是什么?
     只能产生一个实例的类就是单例模式。我们设计一个类,有时只需要使用它一次,比如一台电脑只能有一个显示器,日志的输出,窗口只能有一个,于是我们通过单例模式来实现它,而非全局变量,因为全局变量会影响封装性,不能保证程序不会修改它。

c++单例模式如何实现?
     实现单例模式要注意以下几点:
     1.私有化构造函数,提供公有getInstance()方法访问单例。
     2.利用程序在结束的时候,系统会自动析构所有全局变量(包括静态变量),我们创建一个静态成员变量,它的唯一作用就是在结束时析构单例。
以下是实现代码:
  1. class CSingleton  
  2. {  
  3. private:  
  4.     CSingleton()  
  5.     {  
  6.     }  
  7.     static CSingleton *m_pInstance;  
  8.     class CGarbo   //它的唯一工作就是在析构函数中删除CSingleton的实例  
  9.     {  
  10.     public:  
  11.         ~CGarbo()  
  12.         {  
  13.             if(CSingleton::m_pInstance)  
  14.                 delete CSingleton::m_pInstance;  
  15.         }  
  16.     };  
  17.     static CGarbo Garbo;  //定义一个静态成员变量,程序结束时,系统会自动调用它的析构函数  
  18. public:  
  19.     static CSingleton * GetInstance()  
  20.     {  
  21.         if(m_pInstance == NULL)  //判断是否第一次调用  
  22.             m_pInstance = new CSingleton();  
  23.         return m_pInstance;  
  24.     }  
  25. };  
但是这样做代码量太大,不令人满意,于是有人又通过局部静态变量,实现如下:
  1. class CSingleton  
  2. {  
  3. private:  
  4.     CSingleton()   //构造函数是私有的  
  5.     {  
  6.     }  
  7.     CSingleton(const CSingleton &);  
  8.     CSingleton & operator = (const CSingleton &);  
  9. public:  
  10.     static CSingleton & GetInstance()  
  11.     {  
  12.         static CSingleton instance;   //局部静态变量  
  13.         return instance;  
  14.     }  
  15. };  
拷贝构造函数和赋值运算符的重载只声明不实现,是为了应对类拷贝的问题,这样使用类拷贝的时候系统会报错(私有)。

单例模式的优缺点?
     优点:简单易用,一个全局变量可以与很多对象交互,降低创建多个对象引起的内存管理风险。
     缺点:单例模式提供的全局访问点是很危险的(原因参考设计模式),一般在程序结束前内存都得不到释放。所以必须慎用单例。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值