设计模式C++描述----01.单例(Singleton)模式

一.概念

单例模式:其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。

[cpp]  view plain copy
  1. class CSingleton  
  2. {  
  3. //公有的静态方法,来获取该实例  
  4. public:  
  5. static CSingleton* GetInstance()  
  6. {  
  7.     if ( m_pInstance == NULL )  //判断是否第一次调用  
  8.         m_pInstance = new CSingleton();  
  9.   
  10.     return m_pInstance;  
  11. }  
  12.   
  13. //私有构造函数,防止实例化  
  14. private:  
  15.     CSingleton(){};  
  16.   
  17.   
  18. //私有静态指针变量,指向类的唯一实例  
  19. private:  
  20.     static CSingleton * m_pInstance; //声明一个静态成员  
  21. };  
  22.   
  23. CSingleton* CSingleton::m_pInstance = NULL; //定义并初始化静态数据成员  
  24.   
  25. int main()  
  26. {  
  27.     CSingleton* ps1 = CSingleton::GetInstance();  
  28.     CSingleton* ps2 = CSingleton::GetInstance();  
  29.     CSingleton* ps3 = ps1->GetInstance();  
  30.     CSingleton & ps4 = * CSingleton :: GetInstance();   
  31.   
  32.     if (ps1 == ps2)  
  33.     {  
  34.         cout<< "ps1 = ps2"<<endl;  
  35.     }  
  36.   
  37.     if (ps1 == ps3)  
  38.     {  
  39.         cout<< "ps1 = ps3"<<endl;  
  40.     }  
  41.   
  42.     if (&ps4 == ps1)  
  43.     {  
  44.         cout<< "ps1 = ps4"<<endl;  
  45.     }  
  46.   
  47.     return 0;  
  48. }  

单例模式通过类本身来管理其唯一实例,唯一的实例是类的一个普通对象但设计这个类时,让它只能创建一个实例并提供对此实例的全局访问

用户访问唯一实例的方法只有 GetInstance() 成员函数。如果不通过这个函数,任何创建实例的尝试都将失败,因为类的构造函数是私有的。

有一点要注意:一定要加上 CSingleton* CSingleton::m_pInstance = NULL; 这一句,不然的话编译会出错,因为这一句才是变量定义。

二.单例类CSingleton 有以下特征

它有一个指向唯一实例的静态指针m_pInstance并且是私有的

它有一个公有的函数,可以获取这个唯一的实例,并且在需要的时候创建该实例;

它的构造函数是私有的,这样就不能从别处创建该类的实例。

三.存在的问题

1.m_pInstance 指向的空间什么时候释放呢?

如果在类的析构行为中有必须的操作,比如关闭文件,释放外部资源,那么上面的代码无法实现这个要求。我们需要一种方法,正常的删除该实例。

不合理的解决方法:

在程序结束时调用 GetInstance(),并对返回的指针掉用 delete操作。这样做可以实现功能,但不仅很丑陋,而且容易出错。因为这样的附加代码很容易被忘记,而且也很难保证在delete之后,没有代码再调用 GetInstance 函数。也就是说释放操作由使用者来管理,而不是由类本身来管理,这违背了类的单一职责的原则,这是不合理的。

2. 该实例的析构函数什么时候执行?

上面的类里为什么没有析构函数,其实即便你加上析构函数也是可以的,但是这个析构函数不会被执行的。因为你的实例是 new 出来的,所以只有 delete 时,才会调用析构函数,但是在哪里调用 delete 呢!?这又回到了上面的问题。

一种妥善的方法:

[cpp]  view plain copy
  1. class CSingleton  
  2. {  
  3. public:  
  4.     static CSingleton* GetInstance()  
  5.     {  
  6.         static CSingleton instance; //静态局部变量  
  7.           
  8.         return &instance;  
  9.     }  
  10.   
  11. private:  
  12.   
  13.     CSingleton() {}; //构造函数  
  14.   
  15. };  
局部静态对象实例 instance 是第一次调用 GetInstance() 时被构造,一直保持活动状态直到应用程序终止,与动态分配对象不同,静态对象当应用程序终止时被自动销毁掉,所以就不必再手动销毁实例了。

当然这里,可以加上析构函数来处理你想要的操作。

这样做的要点有以下几点:

1. 静态变量在内存中只有一份,从而保证了单例模式中单一实例的要求。

2. 静态变量在程序终止时会被自动销毁,从而保证了空间正常释放。


转自:http://blog.csdn.net/lwbeyond/article/details/7412499

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值