计划模式 - 单例模式

打印 上一主题 下一主题

主题 1891|帖子 1891|积分 5673

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一个类不管创建多少次对象,永远只能得到该范例一个对象的气力
常用到的,比如日记模块,数据库模块
饿汉式单例模式:还没有获取实例对象,实例对象就已经产生了
懒汉式单例模式:唯一的实例对象,直到第一次获取它的时间,才产生
饿汉式单例模式  饿汉式单例模式一定是线程安全的
  1. #include <iostream>
  2. using namespace std;
  3. class Singleton
  4. {
  5. public:
  6.         static Singleton* getInstance() //3.获取类的唯一实例对象的接口方法
  7.         {
  8.                 return &instance;
  9.         }
  10. private:
  11.         static Singleton instance;//2.定义一个唯一的类的实例对象
  12.         Singleton() //1.构造函数私有化
  13.         {
  14.         }
  15.         Singleton(const Singleton&) = delete;
  16.         Singleton& operator=(const Singleton&) = delete;
  17. };
  18. Singleton Singleton::instance;
  19. int main()
  20. {
  21.         Singleton* p1 = Singleton::getInstance();
  22.         Singleton* p2 = Singleton::getInstance();
  23.         Singleton* p3 = Singleton::getInstance();
  24.         cout << p1 << " " << p2 << " " << p3 << " " << endl;
  25.         return 0;
  26. }
复制代码
懒汉式单例模式 线程安全的懒汉式单例模式案例
  1. #include <iostream>
  2. #include <mutex>
  3. using namespace std;
  4. std::mutex mtx;
  5. class Singleton
  6. {
  7. public:
  8.         //是不是可重入函数呢? 锁+双重判断
  9.         static Singleton* getInstance() //3.获取类的唯一实例对象的接口方法
  10.         {
  11.                 //lock_guard<std::mutex> lck(mtx);//锁的力度太大了
  12.                 if (instance == nullptr)
  13.                 {
  14.                         lock_guard<std::mutex> lck(mtx);
  15.                         if (instance == nullptr)
  16.                         {
  17.                                 //开辟内存,构造对象,给instance赋值
  18.                                 instance = new Singleton();
  19.                         }
  20.                 }
  21.                 return instance;
  22.         }
  23. private:
  24.         static Singleton *volatile instance;//2.定义一个唯一的类的实例对象
  25.         Singleton() //1.构造函数私有化
  26.         {
  27.         }
  28.         Singleton(const Singleton&) = delete;
  29.         Singleton& operator=(const Singleton&) = delete;
  30. };
  31. Singleton* volatile Singleton::instance = nullptr;
  32. int main()
  33. {
  34.         Singleton* p1 = Singleton::getInstance();
  35.         Singleton* p2 = Singleton::getInstance();
  36.         Singleton* p3 = Singleton::getInstance();
  37.         cout << p1 << " " << p2 << " " << p3 << " " << endl;
  38.         return 0;
  39. }
复制代码
更加简便的懒汉式单例模式
  1. #include <iostream>
  2. #include <mutex>
  3. using namespace std;
  4. std::mutex mtx;
  5. class Singleton
  6. {
  7. public:
  8.         //是不是可重入函数呢? 锁+双重判断
  9.         static Singleton* getInstance() //3.获取类的唯一实例对象的接口方法
  10.         {
  11.                 static Singleton instance;//2.定义一个唯一的类的实例对象
  12.                 return &instance;
  13.         }
  14. private:
  15.         Singleton() //1.构造函数私有化
  16.         {
  17.         }
  18.         Singleton(const Singleton&) = delete;
  19.         Singleton& operator=(const Singleton&) = delete;
  20. };
  21. int main()
  22. {
  23.         Singleton* p1 = Singleton::getInstance();
  24.         Singleton* p2 = Singleton::getInstance();
  25.         Singleton* p3 = Singleton::getInstance();
  26.         cout << p1 << " " << p2 << " " << p3 << " " << endl;
  27.         return 0;
  28. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

美食家大橙子

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表