设计模式:单例模式
一.作用
- 不能通过构造函数构造,否则就能够实例化多个,构造函数需要私有声明
- 保证只能产生一个实例
用处:比如程序只能有一个日志系统,只能有一个管理器等
二.简单式
- 直接在类里面进行生成静态对象,但是这样可能会释放多次
- 饿汉:需要开辟内存
class CSingleton{ public: static CSingleton* GetInstance(){ if(m_pInstance==NULL){ //m_pInstance==nullptr m_pInstance=new CSingleton(); } return m_pInstance; } private: CSingleton(){} ~CSingleton(){ if(Singleton::local_instance!=nullptr){ delete Singleton::local_instance; } } static CSingleton* m_pInstance; }; CSingleton* CSingleton::m_pInstance=NULL; //或者 class CSingleton{ public: static CSingleton* GetInstance(){ return m_pInstance; } private: CSingleton(){} ~CSingleton(){ if(Singleton::local_instance!=nullptr){ delete Singleton::local_instance; } } static CSingleton* m_pInstance; }; CSingleton* CSingleton::m_pInstance=new CSingleton();;
//调用 CSingleton* p1=CSingleton::GetInstance(); CSingleton* p2=CSingleton::GetInstance(); //p1和p2地址一样
三.完整式
- 在多线程下可能会new两次,所以直接返回静态对象的地址,就不用开辟内存释放
- 懒汉:没有内存操作
class Singleton{ private: static Singleton* local_instance; Singleton(){} ~Singleton(){} public: static Singleton* getInstance(){ static Singleton local; return &local; } //或者 static Singleton& getInstance(){ static Singleton local; return local; } };
//调用 Singleton* p1=Singleton::getInstance(); Singleton* p2=Singleton::getInstance(); //p1和p2地址一样
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)