千家信息网

设计模式之单例模式:singleton

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,1.设计模式是什么?设计模式其实就是前人总结,代表了最佳实践,对于软件开发过程中对象的封装模式,也是各种复杂问题,极好解耦性的解决方案。--------------------------------
千家信息网最后更新 2026年10月31日设计模式之单例模式:singleton

1.设计模式是什么?

设计模式其实就是前人总结,代表了最佳实践,对于软件开发过程中对象的封装模式,也是各种复杂问题,极好解耦性的解决方案。

-------------------------------------------------------------------------------------------

下面我们来说一下单例模式的基本概念和代码:

  1. 单例类保证了全局只有唯一一个实例对象

  2. 单例提供获取这个唯一实例的接口


其实就是保证一个类中出现对象的全局唯一性。

首先对于单例模式而言,有2种

  1. 懒汉模式:

#include#includeusing namespace std;class singleton{    public:    static singleton* GetInstance()    {        //使用双重检查,保证获取锁的资源不浪费        if(_instance == NULL)        {            std::lock_guardlck(_mtx);            if(instance == NULL)            {                //一下解释标记为a                singleton *tmp = new singleton();                MemoryBarrier();//内存栅栏。后面会进行解释。                _instance = tmp;            }        }          return _instance;          }        static void DelInstance()    {        if(_instance != NULL)        {            delete _instance;            _instance = NULL;        }    }        private:    singleton():data(0){};    singleton(const singleton&){};    singleton& operator = (const sigleton&);    static singleton* _instance;    static mutex _mtx;    int data;}singleton* singleton::_instance = NULL;mutex singleton::_mtx;

其实单例模式没有真想象的这么简单,百度上许多说单例模式的文章都说的有些许遗漏


这里主要解释一下内存栅栏的概念

如果我们将a处代码转换为_instance = new singleton();

这在编译器中处理为3个部分,1.分配空间,2调用构造函数,3.赋值、

但是在某些情况话,编译器可能进行优化进行重排,然后顺序变成了1,3,2.将赋值提到了构造函数之前。

然后设想在高并发场景中,_instance已经进行了赋值,但是没有调用构造函数,其他现场进入,直接返回_instance。一个没有调用构造函数的_instance,这就会出现错误

所以我们声明一个临时变量,然后添加一个内存栅栏,其实就是指令顺序的隔断,不可提前。保证赋值构造的完全调用,其实就有点类似Linux中的sigsuspend();

以上就是完善的懒汉模式。

-------------------------------------------------------------------------------------------

饿汉模式:

饿汉模式使用RAII

//1class singleton{    public:    static singleton* GetInstance()    {        static single sInstance;        return &sInstance;    }     private:    singleton():data(0){};    singleton(const singleton&){};    singleton& operator = (const sigleton&);    static singleton* _instance;    int data;}//2class singleton{    public:    static sington* GetInstance()    {        assert(_instance);        return _instance;    }     private:    singleton():data(0){};    singleton(const singleton&){};    singleton& operator = (const sigleton&);    static singleton* _instance;    int data;}singleton* singleton::_instance = new singleton();

以上。

模式 函数 就是 保证 内存 对象 栅栏 解释 设计模式 设计 代码 全局 实例 懒汉 概念 编译器 顺序 编译 复杂 极好 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技与互联网 互联网科技开发公司 美国互联网科技 兼蜜互联网科技 大白互联网科技 互联网养老 桔豆科技 互联网金融科技委员会 成都玖崟互联网科技有限公司乐商圈怎么样 天速互联网络科技有限公司 互联网科技热点资讯 剑昆互联网络科技有限公司临桂 恒生互联网科技指数跳水 互联网媒体平台算高科技产业 工业互联网山东科技大学 互联网企业科技类企业如何做账 陕西九四连强互联网科技有限公司 求路客互联网科技电话 科技互联网专业务虚会材料 重庆科技产业互联网有哪些 瑞安市蟠桃会互联网科技有限公司 广东万易互联网科技有限公司惠州分公司 广东猪兼强互联网科技有限公司 中国互联网科技股 互联网科技有限公司图片 狮子座互联网科技 期待互联网科技 小马过河互联网科技 区块链结合互联网科技 半导体行业属于互联网高科技类吗 保山浩联互联网科技有限公司
0