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

打印 上一主题 下一主题

主题 975|帖子 975|积分 2925

单例模式的学习笔记
单例模式是为了:在整个系统生命周期内,保证一个类只能产生一个实例,确保该类的唯一性
参见链接1,链接2
  1. #include <iostream>
  2. #include <mutex>
  3. using namespace std;
  4. /*懒汉模式:只有在用到了才实例化对象并返回(调用了对外的接口才会实例对象)*/
  5. /*构造函数私有化,只对外提供一个接口*/
  6. /*线程不安全*/
  7. class singleClass {
  8. public:
  9.         static singleClass* getInstance() // 对外接口,静态成员函数调用静态成员变量
  10.         {
  11.                 if (m_instance == nullptr)  // 在多线程的环境下,在判空的时候可能存在多个线程同时进入if中,此时可能会实例化多个对象
  12.                 {
  13.                         m_instance = new singleClass();
  14.                 }
  15.                 return m_instance;
  16.         }
  17. private:
  18.         static singleClass* m_instance;  // 静态成员变量,类内声明,类外初始化
  19.         singleClass() {}    // 构造函数属性设置为私有
  20.         singleClass (const singleClass & sc) {}  // 拷贝构造函数也设置为私有
  21. };
  22. singleClass* singleClass::m_instance = nullptr;   // 初始化静态变量
  23. /*线程安全*/
  24. class threadSingleClass
  25. {
  26. public:
  27.         static threadSingleClass* getInstance()
  28.         {
  29.                 if (m_instance == nullptr)   // 先判断是否为空,为空就进入;不为空,说明已经存在实例,返回
  30.                 {
  31.                         //m_mutex.lock();   // 这里如果使用unique_lock就不需要在下面解锁
  32.                         unique_lock<mutex> lock(m_mutex);
  33.                         if (m_instance == nullptr)   // 再次判断,确保不会因为加锁期间多个线程同时进入
  34.                         {
  35.                                 m_instance = new threadSingleClass();
  36.                         }
  37.                         //m_mutex.unlock();
  38.                 }
  39.                 return m_instance;
  40.         }
  41. private:
  42.         static threadSingleClass* m_instance;
  43.         static mutex m_mutex;
  44.         threadSingleClass() {};
  45.         threadSingleClass(const threadSingleClass& sc) {}
  46. };
  47. threadSingleClass* threadSingleClass::m_instance = nullptr;
  48. mutex threadSingleClass::m_mutex;
  49. /*饿汉模式:不管调不调用对外接口,都已经实例化对象了。本身就是线程安全的*/
  50. /*类在加载的时候就实力化对象,所以要提前占用系统资源*/
  51. class hungrySingleClass
  52. {
  53. public:
  54.         static hungrySingleClass* getInstance()
  55.         {
  56.                 return m_instance;
  57.         }
  58. private:
  59.         static hungrySingleClass* m_instance;
  60.         hungrySingleClass() {}
  61.         hungrySingleClass(const hungrySingleClass* sc) {}  // 拷贝构造私有
  62. };
  63. hungrySingleClass* hungrySingleClass::m_instance = new hungrySingleClass();
  64. // 类外定义,main开始执行前,该对象就存在了
  65. int main()
  66. {
  67.         singleClass* singlep1 = singleClass::getInstance();
  68.         singleClass* singlep2 = singleClass::getInstance();
  69.         cout << singlep1 << endl;
  70.         cout << singlep2 << endl;
  71.         threadSingleClass* thsinglep1 = threadSingleClass::getInstance();
  72.         threadSingleClass* thsinglep2 = threadSingleClass::getInstance();
  73.         cout << thsinglep1 << endl;
  74.         cout << thsinglep2 << endl;
  75.         hungrySingleClass* hgsinglep1 = hungrySingleClass::getInstance();
  76.         hungrySingleClass* hgsinglep2 = hungrySingleClass::getInstance();
  77.         cout << hgsinglep1 << endl;
  78.         cout << hgsinglep2 << endl;
  79.         system("pause");
  80.         return 0;
  81. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

水军大提督

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表