设计模式——单例模式

鼠扑  金牌会员 | 2024-8-12 22:33:24 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 577|帖子 577|积分 1731

什么是单例模式

一个类只能创建一个对象,即单例模式,该模式下可包管系统中该类只有一个实例,并提供一个访问它的全局接口,该实例被所有程序模块共享。
单例模式有两种实例环境



  • 饿汉模式:程序启动就创建一个唯一的实例对象
  • 懒汉模式:调佣全局接口的时候创建唯一的实例。
饿汉模式

  1. class Singleton
  2. {
  3. public:
  4.         static Singleton* GetInstance()
  5.         {
  6.                 return _ins;
  7.         }
  8.         void Add(const string& str)
  9.         {
  10.                 _mtx.lock();
  11.                 _v.push_back(str);
  12.                 _mtx.unlock();
  13.         }
  14.         void Print()
  15.         {
  16.                 _mtx.lock();
  17.                 for (auto& e : _v)
  18.                 {
  19.                         cout << e << endl;
  20.                 }
  21.                 cout << endl;
  22.                 _mtx.unlock();
  23.         }
  24. private:
  25.         //限制类外随意创建对象
  26.         Singleton()
  27.         {
  28.         }
  29. private:
  30.         int _n;
  31.         vector<string> _v;
  32.         mutex _mtx;
  33.         static Singleton* _ins;
  34. };
  35. Singleton* Singleton::_ins = new Singleton;
复制代码
但是饿汉有一个题目:如果单例对象非常耗时或者占用很多资源,好比加载插件,初始化网络毗连,也有大概在程序一开始用不到,那么在程序一开始创建就会导致程序启动很慢,所以有了懒汉模式。
懒汉模式

  1. class Singleton
  2. {
  3. public:
  4.         static Singleton* GetInstance()
  5.         {
  6.                 //双检查加锁
  7.                 if (_ins == nullptr) //提高效率,不需要每次加锁和解锁
  8.                 {
  9.                         _imtx.lock();
  10.                        
  11.                         if (_ins == nullptr) //保证线程安全,只用new一次
  12.                         {
  13.                                 _ins = new Singleton;
  14.                         }
  15.                         _imtx.unlock();
  16.                 }
  17.                 return _ins;
  18.         }
  19.         void Add(const string& str)
  20.         {
  21.                 _vmtx.lock();
  22.                 _v.push_back(str);
  23.                 _vmtx.unlock();
  24.         }
  25.         void Print()
  26.         {
  27.                 _vmtx.lock();
  28.                 for (auto& e : _v)
  29.                 {
  30.                         cout << e << endl;
  31.                 }
  32.                 cout << endl;
  33.                 _vmtx.unlock();
  34.         }
  35. private:
  36.         //限制类外随意创建对象
  37.         Singleton()
  38.         {
  39.         }
  40. private:
  41.         int _n;
  42.         vector<string> _v;
  43.         mutex _vmtx;
  44.         static mutex _imtx;
  45.         static Singleton* _ins;
  46. };
  47. Singleton* Singleton::_ins = nullptr;
  48. mutex Singleton::_imtx;
复制代码
这里留意一下,创建实例的时候要用双重加锁,由于在多线程的场景下,就去一直加锁判断,要知道锁的斲丧是很大的,所以双重查抄是很紧张的。
懒汉模式的优点:



  • 第一次使用的时候创建实例对象
  • 如果多个单例对象有启动次序要求的话,也可以控制(这点饿汉模式就无法控制了)
懒汉模式的缺点



  • 复杂

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

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

鼠扑

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表