码迷,mamicode.com
首页 > 编程语言 > 详细

C++设计模式-单例模式

时间:2017-12-22 21:56:01      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:实例   静态   enabled   repo   dsa   存储   end   style   需要   

版权声明:若无来源注明,Techie亮博客文章均为原创。 转载请以链接形式标明本文标题和地址:
本文标题:C++设计模式-单例模式     本文地址:http://techieliang.com/2017/12/772/

1. 介绍

几个重点:

  • 构造函数为private
  • 提供一个获取单例对象指针的函数
  • 一个静态指针成员存储单例对象

注意:

  • 获取单例对象也可以获取对象引用,但要注意拷贝构造函数和赋值运算符
  • 如果有多线程访问单例,需要注意线程同步

2. 范例

源码GitHub:CppDesignPattern

2.1. 单线程

  1. #ifndef SIGLETON_H
  2. #define SIGLETON_H
  3. /**
  4. * @brief 非线程安全单例,无多线程时使用
  5. */
  6. class Singleton {
  7. public:
  8. /**
  9. * @brief 单例模式,获取实例化对象
  10. * @param 无
  11. * @return 单例对象
  12. */
  13. static Singleton *GetInstance();
  14. /**
  15. * @brief 单例模式,主动销毁实例化对象
  16. * @param 无
  17. * @return 无
  18. */
  19. static void DestoryInstance();
  20. private:
  21. /**
  22. * @brief 构造函数
  23. */
  24. Singleton();
  25. /**
  26. * @brief 单例模式在程序结束时自动删除单例的方法
  27. */
  28. class SingletonDel {
  29. public:
  30. ~SingletonDel() {
  31. if (m_instance != NULL) {
  32. delete m_instance;
  33. m_instance = NULL;
  34. }
  35. }
  36. };
  37. static SingletonDel m_singleton_del;///程序结束时销毁
  38. static Singleton *m_instance; //单例对象指针
  39. };
  40. #endif // SIGLETON_H
  41. //cpp
  42. #include "sigleton.h"
  43. Singleton* Singleton::m_instance = nullptr;
  44. Singleton *Singleton::GetInstance() {
  45. if (m_instance == nullptr) {
  46. m_instance = new Singleton();
  47. }
  48. return m_instance;
  49. }
  50.  
  51. void Singleton::DestoryInstance() {
  52. if (m_instance != nullptr) {
  53. delete m_instance;
  54. m_instance = nullptr;
  55. }
  56. }
  57.  
  58. Singleton::Singleton() {
  59. }

2.2. 多线程

  1. #ifndef THREAD_SAFE_SINGLETON_H
  2. #define THREAD_SAFE_SINGLETON_H
  3. /**
  4. * @brief 线程安全单例,多线程时使用
  5. */
  6. class ThreadSafeSingleton {
  7. public:
  8. /**
  9. * @brief 单例模式,获取实例化对象
  10. * @param 无
  11. * @return 单例对象
  12. */
  13. static ThreadSafeSingleton* GetInstance();
  14. /**
  15. * @brief 单例模式,主动销毁实例化对象
  16. * @param 无
  17. * @return 无
  18. */
  19. static void DestoryInstance();
  20. private:
  21. /**
  22. * @brief 构造函数
  23. */
  24. ThreadSafeSingleton();
  25. /**
  26. * @brief 单例模式在程序结束时自动删除单例的方法
  27. */
  28. class SingletonDel {
  29. public:
  30. ~SingletonDel() {
  31. if (m_instance != NULL) {
  32. delete m_instance;
  33. m_instance = NULL;
  34. }
  35. }
  36. };
  37. static ThreadSafeSingleton m_singleton_del;///程序结束时销毁
  38. static ThreadSafeSingleton *m_instance; //单例对象指针
  39. };
  40. #endif // THREAD_SAFE_SINGLETON_H
  41.  
  42. #include "thread_safe_singleton.h"
  43. #include <QMutex>
  44. #include <QMutexLocker>
  45. namespace thread_safe_singleton_private {
  46. static QMutex mutex;
  47. }
  48. ThreadSafeSingleton* ThreadSafeSingleton::m_instance = nullptr;
  49. ThreadSafeSingleton *ThreadSafeSingleton::GetInstance() {
  50. if (m_instance == nullptr) {
  51. QMutexLocker lock(thread_safe_singleton_private::mutex);
  52. if (m_instance == nullptr) {
  53. m_instance = new ThreadSafeSingleton();
  54. }
  55. }
  56. return m_instance;
  57. }
  58.  
  59. void ThreadSafeSingleton::DestoryInstance() {
  60. if (m_instance != nullptr) {
  61. delete m_instance;
  62. m_instance = nullptr;
  63. }
  64. }
  65.  
  66. ThreadSafeSingleton::ThreadSafeSingleton() {
  67. }
 

上面的范例提供了主动销毁单例的方法同时提供了自动销毁的方法。

若主动销毁需注意其他存储了单例指针的对象

相关链接:C++设计模式

转载请以链接形式标明本文标题和地址:Techie亮博客 » C++设计模式-单例模式

C++设计模式-单例模式

标签:实例   静态   enabled   repo   dsa   存储   end   style   需要   

原文地址:http://www.cnblogs.com/techiel/p/8087489.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!