当前位置: 首页 > news >正文

《单例模式(极简c++)》

         本文章属于专栏《设计模式(极简c++版)》


        继续上一篇《建造者模式(极简c++)》。本章简要说明单例模式。本文分为模式说明、本质思想、实践建议、代码示例四个部分。

模式说明
  • 方案: 单例模式确保一个类只有一个实例,并提供一个全局访问点。
  • 优点: 减少内存占用,避免重复创建对象,提供全局访问点。
  • 缺点: 需要业务理解,将单例改为非单例,对原有代码逻辑有影响
本质思想:通过静态方法或者全局变量确保类只有一个实例,并提供访问这个实例的全局访问点。
实践建议:c++11之后,放弃考虑所谓的饿汉、懒汉模式,在实践中已经无用了。因为c++11之后static初始化已经线程安全了,并且在第一次使用时才创建。

代码示例

#include <iostream>class Bird {
public:// 静态方法获取唯一实例static Bird* getInstance() {static Bird instance; // 静态局部变量初始化,在C++11中是线程安全的return &instance;}void fly() {std::cout << "Bird is flying." << std::endl;}private:// 将构造函数私有化Bird() {}
};int main() {// 获取实例并调用方法Bird* bird = Bird::getInstance();bird->fly();// 尝试再次获取实例,应该返回相同实例Bird* anotherBird = Bird::getInstance();if (bird == anotherBird) {std::cout << "Both pointers point to the same instance." << std::endl;}// 输出:/*Bird is flying.Both pointers point to the same instance.*/return 0;
}

相关文章:

  • 微服务高级篇(一):微服务保护+Sentinel
  • 使用OpenRewrite自动做框架升级比如Spring Boot
  • android studio 安装lombok插件
  • 软件工程-第7章 面向对象方法RUP
  • 【CNN轻量化】RepViT: Revisiting Mobile CNN From ViT Perspective
  • Webpack的构建流程
  • linux安装rabbitmq
  • Java-Java基础学习(2)-网络编程-TCP-UDP
  • 【FPGA】摄像头模块OV5640
  • 理解C#和.NET的应用模型
  • discuz、ecshop、帝国cms部署https(ssl)后会员无法登录
  • UGUI源码分析与研究3-扩展UGUI实现自定义UI组件
  • 计算机网络:数据交换方式
  • 研究人员发现 OpenAI ChatGPT、Google Gemini 的漏洞
  • GitHub Copilot+ESP开发实战-串口
  • python3.6+scrapy+mysql 爬虫实战
  • 【个人向】《HTTP图解》阅后小结
  • 【知识碎片】第三方登录弹窗效果
  • codis proxy处理流程
  • Linux快速复制或删除大量小文件
  • log4j2输出到kafka
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Vue2.0 实现互斥
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 分享几个不错的工具
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 如何选择开源的机器学习框架?
  • 如何在 Tornado 中实现 Middleware
  • python最赚钱的4个方向,你最心动的是哪个?
  • #laravel 通过手动安装依赖PHPExcel#
  • #mysql 8.0 踩坑日记
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (12)目标检测_SSD基于pytorch搭建代码
  • (第61天)多租户架构(CDB/PDB)
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (三分钟)速览传统边缘检测算子
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (一)Java算法:二分查找
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .net CHARTING图表控件下载地址
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET MVC之AOP
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • /proc/stat文件详解(翻译)
  • [Android] Implementation vs API dependency
  • [android]-如何在向服务器发送request时附加已保存的cookie数据
  • [Android]使用Retrofit进行网络请求