设计模式12——单例模式(Singleton)
单例通过一个对象只能创建一个该类的实例。当然可以创建两个指针指向该实例。应用场景比如在某个服务器程序中该服务器的配置信息存放在一个文件中这些配置数据由一个单例对象统一读取然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。其他还有如系统的日志输出、MODEM的联接需要一条且只需要一条电话线操作系统只能有一个窗口管理器一台PC连一个键盘等等。当需要频繁调用该类时单例类可以保证无需重复创建节省资源。1 懒汉模式classSingleton{private:Singleton();Singleton(constSingletonother);public:staticSingleton*getInstance();staticSingleton*m_instance;};首先所有单例类设计必须私有化构造函数、拷贝构造函数//线程非安全版本两个线程检测同一个m_instance;Singleton*Singleton::getInstance(){if(m_instancenullptr){m_instancenewSingleton();}returnm_instance;}上述代码在单线程是安全的它首先检测是否为空但是在多线程中由于线程调度的问题可鞥两个线程都检测到m_instance为空。下面是调用锁的版本一共两个//线程安全版本但锁的代价过高Singleton*Singleton::getInstance(){Lock lock;if(m_instancenullptr){m_instancenewSingleton();}returnm_instance;}/双检查锁但由于内存读写reorder不安全 Singleton*Singleton::getInstance(){if(m_instancenullptr){Lock lock;if(m_instancenullptr){m_instancenewSingleton();}}returnm_instance;}在双检查锁中reorder指的是new Singleton()时编译器可能不是按我们所想的步骤进行的他可能只分配了内存就返回了申请的地址但还未调用构造函数所以此时可能还是为空另一线程在调用getInstance就会创建两个单例对象。在C11后的实现方式如下解决了上述问题#includeiostream#includemutexclassSingleton{private:Singleton(){std::coutSingleton constructed!\n;}~Singleton()default;Singleton(constSingleton)delete;Singletonoperator(constSingleton)delete;staticSingleton*instance;staticstd::once_flag onceFlag;public:staticSingletongetInstance(){std::call_once(onceFlag,‌[]{instancenewSingleton();});return*instance;}};Singleton*Singleton::instancenullptr;std::once_flag Singleton::onceFlag;还有一种方式将单例对象以局部静态对象的方式定义在函数内部C11可以保证多个线程不会同时进入静态变量的初始化流程。templatetypenameTclassSingleton{public:staticTGetInstance(){staticT instance;returninstance;}Singleton(T)delete;Singleton(constT)delete;voidoperator(constT)delete;protected:Singleton()default;virtual~Singleton()default;};2 饿汉模式饿汉模式采用直接定义静态对象的方法classSingleton{private:Singleton(){};Singleton(constSingleton){};//拷贝构造函数private:staticSingleton m_instance;public:staticSingletongetInstance(){returnm_instance;}};Singleton Singleton::m_instance;//静态对象类外定义//函数调用SingletoninstanceSingleton::GetInstance();上述代码实现简单可用于多线程。但是1如果存在多个单例对象且这几个单例对象相互依赖可能会出现程序崩溃的危险。原因:对编译器来说静态成员变量的初始化顺序和析构顺序是一个未定义的行为;具体分析在懒汉模式中也讲到了。2在程序开始时就创建类的实例如果Singleton对象产生很昂贵而本身有很少使用这种方式单从资源利用效率的角度来讲比懒汉式单例类稍差些。但从反应时间角度来讲则比懒汉式单例类稍好些。饿汉模式采用静态指针 类外初始化时new空间classSingleton{public:staticSingleton*GetInstance();private:Singleton(){}Singleton(constSingleton);private:staticSingleton*m_Instance;};//CPP文件Singleton*Singleton::m_InstancenewSingleton();//类外定义-不要忘记写Singleton*Singleton::GetInstance(){returnm_Instance;}

相关新闻

JSH-ERP 传统部署 + Nginx 反向代理 + 统一日志收集完整实施文档

JSH-ERP 传统部署 + Nginx 反向代理 + 统一日志收集完整实施文档

一、项目说明与考核标准1. 服务器环境部署节点:10.8.0.10(ERP 业务主节点,MySQL/Redis/JDK/Maven/Node/Nginx/ERP 后端 / Filebeat 全部部署于此) 日志存储检索节点:10.8.0.11(部署 ElasticsearchKibana&am…

2026/8/22 20:01:53 阅读更多 →
从投料到成品只需90分钟:河北CCS产线的一站式极速之旅,千亿集群加速跑

从投料到成品只需90分钟:河北CCS产线的一站式极速之旅,千亿集群加速跑

动力电池行业的竞争,已经从前端的材料配方延伸到了后端的制造效率。当“量产即出口”成为河北锂电产业的新标签,产业链上游的CCS(Cells Contact System,集成母排)制造环节,正在成为决定整条产线节拍的关键变…

2026/8/21 2:10:49 阅读更多 →
IDEA集成Redis插件全解析:免费与收费方案对比及实战配置指南

IDEA集成Redis插件全解析:免费与收费方案对比及实战配置指南

1. 项目概述:为什么我们需要在IDEA里直连Redis? 作为一名常年泡在Java后端开发里的程序员,我每天打交道最多的除了IDEA,就是各种中间件,Redis绝对是其中的明星。调试代码时,最烦人的场景之一就是&#xff1…

2026/8/21 3:30:57 阅读更多 →

最新新闻

企业级 Agentic RAG 落地:让系统自动决定检索几轮

企业级 Agentic RAG 落地:让系统自动决定检索几轮

一、上篇的终点,就是本篇的起点 上篇我们用 RAG 架构搭好了企业级知识库,混合检索 重排 记忆沉淀都上了。数据一度很好看:朴素 RAG 的召回率能做到 70%,进阶 RAG 拉到 92%,单轮检索的平均准确率到 85%。但一到生产&a…

2026/8/22 22:11:56 阅读更多 →
VS 卸载不干净?用微软开源工具彻底清残留

VS 卸载不干净?用微软开源工具彻底清残留

VS 卸载不干净?用微软开源工具彻底清残留 【免费下载链接】VisualStudioUninstaller Visual Studio Uninstallation sometimes can be unreliable and often leave out a lot of unwanted artifacts. Visual Studio Uninstaller is designed to thoroughly and reli…

2026/8/22 22:11:56 阅读更多 →
5分钟跑通ResNet-50图像分类:microsoft/resnet-50 从加载到部署的实用指南

5分钟跑通ResNet-50图像分类:microsoft/resnet-50 从加载到部署的实用指南

5分钟跑通ResNet-50图像分类:microsoft/resnet-50 从加载到部署的实用指南 【免费下载链接】resnet-50 项目地址: https://ai.gitcode.com/hf_mirrors/microsoft/resnet-50 手上有一批照片,想知道每张照片在 ImageNet 的 1000 个类别里属于哪一类…

2026/8/22 22:11:56 阅读更多 →
DeepSeek Harness 中文检索为什么搜不到「消耗」两个字?—— unicode61 缺陷 + trigram + LIKE 回退的完整修复

DeepSeek Harness 中文检索为什么搜不到「消耗」两个字?—— unicode61 缺陷 + trigram + LIKE 回退的完整修复

DeepSeek Harness 中文检索为什么搜不到「消耗」两个字?—— unicode61 缺陷 trigram LIKE 回退的完整修复 🏷️ 标签:#DeepSeek-Harness #FTS5 #中文全文检索 #trigram #SQLite 🔍 关键词:DeepSeek Harness 中文检索…

2026/8/22 22:11:56 阅读更多 →
Resynthesizer 纹理合成:3个场景修图出贴图,免费GIMP插件直接上手

Resynthesizer 纹理合成:3个场景修图出贴图,免费GIMP插件直接上手

Resynthesizer 纹理合成:3个场景修图出贴图,免费GIMP插件直接上手 【免费下载链接】resynthesizer Suite of gimp plugins for texture synthesis 项目地址: https://gitcode.com/gh_mirrors/re/resynthesizer Resynthesizer(GIMP Res…

2026/8/22 22:11:56 阅读更多 →
macOS光标主题在Windows和Linux上怎么装?Apple Cursor上手指南

macOS光标主题在Windows和Linux上怎么装?Apple Cursor上手指南

macOS光标主题在Windows和Linux上怎么装?Apple Cursor上手指南 【免费下载链接】apple_cursor Free & Open source macOS Cursors. 项目地址: https://gitcode.com/gh_mirrors/ap/apple_cursor Apple Cursor 是一款开源的 macOS 风格鼠标指针主题&#x…

2026/8/22 22:10:55 阅读更多 →

日新闻

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

在电子硬件开发领域,PCB(印制电路板)的沉金工艺是提升产品可靠性和焊接质量的关键环节。对于需要高密度互连、长期稳定运行或高频信号传输的板卡,如“黍姐仿通行证”这类可能涉及身份识别、数据交互的硬件项目,选择正确…

2026/8/22 0:00:11 阅读更多 →
电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

这次我们来看一个针对电气考研电路科目的学习规划项目。它不是软件工具,而是一套聚焦于8月份关键节点的备考策略。对于电气工程考研的同学来说,电路分析是专业课的重中之重,也是拉开分差的关键。进入8月,复习进入强化阶段&#xf…

2026/8/22 0:00:11 阅读更多 →
消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

大家好,我是专注于前端开发与AI工具实践的技术博主。在日常使用 Claude Code 等AI编程助手时,你是否也遇到过这样的困扰:生成的代码功能上没问题,但代码风格、组件设计、交互逻辑总透着一股“AI味”——布局单调、样式简陋、交互生…

2026/8/22 0:00:11 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/21 3:21:33 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/22 8:09:09 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/21 6:07:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/22 18:08:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/22 7:31:03 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →