C++11单例模式

devtools/2024/9/18 0:55:07/ 标签: c++, 单例模式, spring

🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++,linux

🔥座右铭:“不要等到什么都没有了,才下定决心去做”

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

单例模式

单例模式通常包含以下几个要素

饿汉模式

使用方法

懒汉模式

使用方法


单例模式

单例模式是一种设计模式,其核心思想是确保一个类只有一个实例

单例模式通常包含以下几个要素

私有的构造函数(Private Constructor): 单例类的构造函数通常是私有的,这样外部就无法直接实例化该类。

静态成员变量(Static Member Variable): 单例类通常包含一个静态成员变量,用于存储唯一的实例。

静态访问方法(Static Access Method): 单例类提供一个静态的访问方法,用于获取该类的实例。如果该类的实例不存在,则在该方法内部创建一个新的实例,并返回给调用者。

延迟初始化(Lazy Initialization): 单例模式通常采用延迟初始化的方式来创建实例,即在第一次访问时才创建实例,而不是在类加载时就创建实例。

线程安全性(Thread Safety): 如果单例模式在多线程环境下使用,需要考虑实现线程安全的方式来确保只有一个实例被创建。

饿汉模式

饿汉模式是单例模式的另一种实现方式,与懒汉模式相反,饿汉模式在类加载时就创建了单例对象,而不是等到首次被调用时才进行实例化。因此,无论是否需要使用该单例对象,饿汉模式都会在程序启动时进行实例化。

饿汉模式通常采用以下方式实现:

私有构造函数: 将类的构造函数设置为私有,防止外部直接实例化该类。静态成员变量: 在类中声明一个静态成员变量,并在声明时直接进行实例化。静态获取方法: 提供一个静态的公有方法,用于获取单例对象的实例。在该方法
中直接返回预先创建好的单例对象。

注意:饿汉模式的实现相对简单,不需要考虑线程安全性,因为在类加载时就已经创建了单例对象,不会存在多线程竞争创建实例的情况。因此,饿汉模式通常是线程安全的。

使用方法
1)构造函数设为私有
2)instance//单例为静态成员变量,类内声明,类外初始化static 类名* instance
类名* 类名::instance=new 类名();//类外定义
3)创建对外接口,通过这个获取单例
Static 类名* getinstance()
{return instance;
}

事例:

class A
{
public:static A* GetInstance(){return _inst;}void add(const string& str){_dict[str]++;}void print(){for(auto& e:_dict){cout<<e.first<<":"<<e.second<<endl;}}
private:A(){}map<string,int> _dict;int _n=0;static A* _inst;//静态成员是属于类的,不属于对象的
};
A* A::_inst=new A();//提前创建对象优点:实现简单
缺点:可能导致进程启动慢,如果两个单例有启动先后顺序,那么饿汉无法控制

懒汉模式

懒汉模式是单例模式的一种实现方式,其特点是在首次被调用时才会创建单例对象。懒汉模式延迟了单例对象的实例化,直到第一次被使用时才进行实例化。

懒汉模式通常采用以下方式实现:

私有构造函数: 将类的构造函数设置为私有,防止外部直接实例化该类。静态成员变量: 在类中声明一个静态成员变量,用于保存单例对象的实例。静态获取方法: 提供一个静态的公有方法,用于获取单例对象的实例。在该方法中,
判断单例对象是否已经被创建,如果没有则进行实例化并返回,如果已经被创建则直接返回已有的实例。

注意:懒汉模式的实现中需要考虑多线程环境下的线程安全性,因为在多线程环境下,可能会出现多个线程同时判断单例对象是否为空,导致多次创建实例的问题。

使用方法
1)构造函数设为私有
2)instance//单例为静态成员变量,类内声明,类外初始化static 类名* instance
类名* 类名::instance=nullptr;//类外定义
3)创建对外接口,通过这个获取单例
Static 类名* getinstance()
{//这里为什么要用俩个if呢?因为我们在内层if进行加锁了,加锁为了保证只有一个线程去创建单例。其实可以把锁加在外层if,但是这样会导致每个线程都会去申请锁,这样导致资源浪费,所以我们把锁加在内层的if,只要有一个线程创建了单例,那其他线程就不会进入到内层ifif(instance==nullptr){//这里可以加一把锁if(instance==nullptr){instance=new 类名();}//解锁}return instance;
}

事例

懒汉模式:第一次使用的时候再创建
//new的懒汉对象一般不需要释放
class B
{
public:static B* GetInstance(){if(_inst==nullptr){_inst=new B;}return _inst;}void add(const string& str){_dict[str]++;}void print(){for(auto& e:_dict){cout<<e.first<<":"<<e.second<<endl;}}
private:B(){}map<string,int> _dict;int _n=0;static B* _inst;//静态成员是属于类的,不属于对象的
};
B* B::_inst;int main()
{B::GetInstance()->add("苹果");B::GetInstance()->add("苹果");B::GetInstance()->add("葡萄");B::GetInstance()->print();return 0;
}
优点:启动快
缺点:存在线程安全

 🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸  


http://www.ppmy.cn/devtools/13818.html

相关文章

Ubuntu 22.04 配置VirtualBox安装Windows 10虚拟机

Ubuntu 22.04 配置VirtualBox安装Windows 10虚拟机 文章目录 Ubuntu 22.04 配置VirtualBox安装Windows 10虚拟机1.安装virtualbox2.下载Window.iso文件并载入3.问题解决3.1 Kernel driver not installed (rc-1908)3.2 VT-x is disabled in the BIOS for all CPU modes 4.安装Wi…

【LeetCode热题100】【子串】最小覆盖子串

题目链接&#xff1a;76. 最小覆盖子串 - 力扣&#xff08;LeetCode&#xff09; 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 "" 先用一个哈希表记录目标字符串tar…

2024蓝桥杯每日一题(分解质因数)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一&#xff1a;约数个数 试题二&#xff1a;分解质因数 试题三&#xff1a;质因数个数 试题四&#xff1a;完全平方数 试题五&#xff1a;阶乘分解 试题一&#xff1a;约数个数 【题目描述】…

Java离线视频提取音频+音频提取文案

需引入依赖javacv、vosk相关依赖&#xff0c; 至于javacv依赖&#xff0c;网上有很多缩减方案&#xff0c;注释部分是可行的缩减方案&#xff0c;至于视频提取视频这里无需安装ffmpeg&#xff0c;只需引入依赖。而vosk需要下载模型方可使用&#xff0c;并且下载比较慢&#xf…

C++模版初阶

目录 1.泛型编程 2.函数模版 2.1 函数模版概念 2.2 函数模版格式 2.3 函数模版的原理 2.4 函数模版的实例化 2.5 模版参数的匹配原则 3.类模版 3.1 类模版的定义格式 3.2 类模版的实例化 1.泛型编程 如何实现一个通用的交换函数&#xff1f; void Swap(char& l…

Springboot的日常操作技巧

文章目录 1、自定义横幅2、容器刷新后触发方法自定义3、容器启动后触发方法自定义**CommandLineRunner**ApplicationRunner 不定时增加 参考文章 1、自定义横幅 简单就一点你需要把banner.text放到classpath 路径下 &#xff0c;默认它会找叫做banner的文件&#xff0c;各种格式…

发票查验详情、C票据识别、发票ocr

翔云人工智能开放平台自从上架了发票识别、发票验真两个API产品接到了不少咨询&#xff0c;除了产品本身咨询&#xff0c;同时也记录了一些容易被忽略的开票注意事项&#xff0c;在此分享几个典型的示例给大家&#xff0c;希望能帮到相关业务人员。 翔云发票验真 问题1&#…

解密数字经济时代,元宇宙企业如何重塑商业价值?

从复盘中感知自我&#xff0c;坚持和过去对话&#xff0c;并引入未来的思考&#xff0c;飞天云动是一个典型的案例。 在科技的飞速发展和数字化浪潮的推动下&#xff0c;元宇宙这一概念如同一颗冉冉升起的新星&#xff0c;吸引了全球的目光。就目前而言&#xff0c;围绕元宇宙…

【方案探讨】 出现java.io.IOException解决方法

出现java.io.IOException解决方法 解决问题的博客&#xff1a;探索新思路&#xff0c;共同成长 &#x1f331;壹、出现背景贰、排查方向叁、场景复现1、放单个大文件2、修改后端请求其他服务器时间3、多次请求多个文件4、单词请求多个文件 肆、解决方案谢谢您的阅读和支持&…

Laravel 6 - 第十五章 验证器

​ 文章目录 Laravel 6 - 第一章 简介 Laravel 6 - 第二章 项目搭建 Laravel 6 - 第三章 文件夹结构 Laravel 6 - 第四章 生命周期 Laravel 6 - 第五章 控制反转和依赖注入 Laravel 6 - 第六章 服务容器 Laravel 6 - 第七章 服务提供者 Laravel 6 - 第八章 门面 Laravel 6 - …

《十》Qt各种对话框之QFontDialog

QFontDialog 在介绍 QFontDialog 对话框之前&#xff0c;我们先简单介绍一下 QFont 字体类。QFont 主要用于控制文本显示的字体&#xff0c;字体主要有四大属性&#xff1a;①字体家族 family 决定字体外观家族&#xff0c;比如宋体、楷体等&#xff1b; ②字号 pointSize &am…

Vue3从入门到实战:深度掌握组件通信(上部曲)

props的概念&#xff1a; 当你使用Vue 3的组合式API时&#xff0c;props就是一种让你可以从父组件向子组件传递数据的方式。你可以想象成你在给子组件写一封信&#xff0c;把需要传递的信息放在信封里。 在Vue 3中&#xff0c;你可以在子组件的代码中定义props&#xff0c;就…

软考133-上午题-【软件工程】-软件项目估算

一、COCOMO 估算模型 COCOMO 模型是一种精确的、易于使用的成本估算模型。 COCOMO 模型按其详细程度分为&#xff1a;基本 COCOMO 模型、中级 COCOMO 模型和详细 COCOMO 模型。 1&#xff09;基本 COCOMO 模型 基本 COCOMO 模型是一个静态单变量模型&#xff0c;用于对整个软…

Docker - WEB应用实例

原文地址&#xff0c;使用效果更佳&#xff01; Docker - WEB应用实例 | CoderMast编程桅杆Docker - WEB应用实例 在之前的章节中&#xff0c;仅对普通容器进行了演示&#xff0c;但在实际中常常使用到 Docker 容器中的 WEB 应用程序。 运行一个WEB应用 拉取镜像 创建一个容器…

常见排序算法(插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序,计数排序,基数排序,桶排序)

一.排序的概念 1.排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作 2.稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排…

【Python】Python函数的黑魔法:递归,嵌套函数与装饰器

欢迎来到CILMY23的博客 本篇主题为&#xff1a; Python函数的黑魔法&#xff1a;递归&#xff0c;嵌套函数与装饰器 个人主页&#xff1a;CILMY23-CSDN博客 系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 感谢观看&#xff0c;支持的可以给个一键三连&#xff…

【上海大学计算机组成原理实验报告】四、指令系统实验

一、实验目的 了解指令结构、PC寄存器的功能和指令系统的基本工作原理。 学习设计指令的方法。 二、实验原理 根据实验指导书的相关内容&#xff0c;对于部分使用频率很高&#xff0c;且只用几条微指令即可完成的简单操作&#xff0c;可以把这部分简单操作的微指令序列固定下…

代码随想录day46 | 动态规划P8 | ● 139. ● 多重背包● 背包问题总结

139.单词拆分 思路 本道是枚举分割所有字符串&#xff0c;判断是否在字典里出现过。可以使用回溯法 / 完全背包解法 回溯: 代码随想录第二十七天 | 回溯算法P3 |● 39. ● 40.● 131.-CSDN博客 之前讲解回溯法专题的时候&#xff0c;讲过的一道题目 lc 131&#xff0c;就是…

同旺科技 USB TO SPI / I2C适配器读写24LC128--读写

所需设备&#xff1a; 1、USB 转 SPI I2C 适配器&#xff1b;内附链接 2、24LC128芯片&#xff1b; 适应于同旺科技 USB TO SPI / I2C适配器专业版&#xff1b; 专业版配套软件更新&#xff1b; 直接读取HEX文件&#xff0c;自动完成文件解析&#xff1b; 支持芯片&#xf…

论文笔记:HG-SL 面向假新闻早期发现的全局和本地用户传播行为联合学习

整理了AAAI2023 HG-SL: Jointly Learning of Global and Local User Spreading Behavior for Fake News Early Detection&#xff09;论文的阅读笔记 背景模型问题定义学习过程特征融合 实验 背景 经典的假新闻检测方法主要基于新闻内容&#xff0c;考虑到假新闻是为了误导消费…