C++学习Day04之单例模式

目录

  • 一、程序及输出
    • 1.1 饿汉式实例
    • 1.2 饿汉式单例
    • 1.3 懒汉式单例
    • 1.4 线程安全的懒汉式单例
  • 二、分析与总结


一、程序及输出

1.1 饿汉式实例

#include<iostream>
using namespace std;
#include <string>
class Printer
{
public:static Printer * getInstance()//获取实例方法{return printer;}void printText(string text){m_Count++;cout << text << endl;}int m_Count;private:Printer() //单例构造函数{ m_Count = 0;cout << "打印机构造调用" << endl; };Printer(const Printer & p){};//拷贝构造函数static Printer * printer;//单例实体};Printer * Printer::printer = new Printer();//类外初始化void test01()
{Printer * p1 = Printer::getInstance();p1->printText("入职证明");p1->printText("离职证明");p1->printText("加薪申请");p1->printText("旅游申请");cout << "打印机使用次数: " << p1->m_Count << endl;Printer * p2 = Printer::getInstance();p2->printText("调休申请");cout << "打印机使用次数: " << p1->m_Count << endl;}int main(){cout << "mian函数调用" << endl;    //单例模式编译阶段就分配内存,所以单例模式的构造函数会先打印。test01();system("pause");return EXIT_SUCCESS;
}

输出:
在这里插入图片描述

可以看到,单例的创建是在全局作用域中进行初始化,编译阶段就分配内存,所以单例模式的构造函数会先打印

1.2 饿汉式单例

饿汉式单例模式
在程序启动时即创建单例实例。这样可以确保在多线程环境下也不会出现多个实例被创建的情况。
实现方式是将构造函数私有化,然后在类的内部定义一个静态成员变量来保存单例实例,并提供一个静态成员函数用于获取该实例。

class Singleton {
public:static Singleton * getInstance() {return instance;}private:Singleton() {}static Singleton * instance;
};Singleton * Singleton::instance = new Singleton();

跟我们最开始的实例框架结构一致

1.3 懒汉式单例

懒汉式单例模式
在需要时才创建单例实例。这种方式可能需要考虑多线程环境下的线程安全性。
实现方式是将构造函数私有化,然后在类的内部定义一个静态成员变量指针,并在静态成员函数中进行实例化。

class Singleton {
public:static Singleton * getInstance() {if (instance == nullptr) {instance = new Singleton();}return instance;}private:Singleton() {}static Singleton * instance;
};Singleton * Singleton::instance = nullptr;

1.4 线程安全的懒汉式单例

线程安全的懒汉式单例模式
在懒汉式单例模式的基础上,通过加锁等手段来确保在多线程环境下也只有一个实例被创建。
可以使用互斥锁(mutex)或双重检查锁定(double-checked locking)等方式来实现线程安全的单例模式。

class Singleton {
public:static Singleton * getInstance() {if (instance == nullptr) {std::lock_guard<std::mutex> lock(mutex);if (instance == nullptr) {instance = new Singleton();}}return instance;}private:Singleton() {}static Singleton * instance;static std::mutex mutex;
};Singleton * Singleton::instance = nullptr;
std::mutex Singleton::mutex;

二、分析与总结

单例设计模式是一种创建型设计模式,用于确保类只有一个实例,并提供全局访问点以访问该实例
分为饿汉式懒汉式
在具体使用过程中注意线程安全、实例化过程等细节

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/676561.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

零基础学编程怎么入手,中文编程工具构件箱之渐变背景构件用法教程,系统化的编程视频教程上线

零基础学编程怎么入手&#xff0c;中文编程工具构件箱之渐变背景构件用法教程&#xff0c;系统化的编程视频教程上线 一、前言 今天给大家分享的中文编程开发语言工具资料如下&#xff1a; 编程入门视频教程链接 https://edu.csdn.net/course/detail/39036 编程工具及实例…

Python速成篇(基础语法)下(新年快乐♥)

引言 一天不学编程手就痒&#xff0c;今天是除夕&#xff0c;学C艹vector的话就没时间出去玩了&#xff0c;所以就写写博客。今天要讲的内容是关于&#xff0c;list&#xff08;列表&#xff09;&#xff0c;tuple&#xff08;元组&#xff09;&#xff0c;字典&#xff08;di…

005集——shp格式数据转换乱码问题——arcgis

shp数据格式与其他数据格式转换过程中会遇到乱码等问题&#xff0c;原因如下&#xff1a; 在Shapefile头文件&#xff08;dBase Header&#xff09;中&#xff0c;一般会包含字符编码信息&#xff0c;这个信息称为 LDID &#xff08; Language Driver ID&#xff09;。在使用ar…

python3 获取某个文件夹所有的pdf文件表格提取表格并一起合并到excel文件

下面是一个完整的示例&#xff0c;其中包括了merge_tables_to_excel函数的定义&#xff0c;并且假设该函数的功能是从每个PDF文件中提取第一个表格并将其合并到一个Excel文件中&#xff1a; import os from pathlib import Path import pandas as pd import pdfplumber …

leetcode 3027. 人员站位的方案数 II【离散化前缀和+枚举】

原题链接&#xff1a;3027. 人员站位的方案数 II 题目描述&#xff1a; 给你一个 n x 2 的二维数组 points &#xff0c;它表示二维平面上的一些点坐标&#xff0c;其中 points[i] [xi, yi] 。 我们定义 x 轴的正方向为 右 &#xff08;x 轴递增的方向&#xff09;&#x…

vue-内置组件-Suspense

Suspense (实验性功能) <Suspense> 是一项实验性功能。它不一定会最终成为稳定功能&#xff0c;并且在稳定之前相关 API 也可能会发生变化。 <Suspense> 是一个内置组件&#xff0c;用来在组件树中协调对异步依赖的处理。它让我们可以在组件树上层等待下层的多个嵌…

[word] word2019段落中创建纵横混排的方法图解教程 #知识分享#其他#职场发展

word2019段落中创建纵横混排的方法图解教程 有时候在word文档中需要让文字纵横混排&#xff0c;word2019正好为我们带来了纵横混排的功能了&#xff0c;今天我们就来给大家介绍一下word2019段落中创建纵横混排的方法。 步骤1&#xff1a;打开Word文档&#xff0c;选中需要纵向…

ARM:AI 的翅膀,还能飞多久?

ARM&#xff08;ARM.O&#xff09;于北京时间 2024 年 2 月 8 日上午的美股盘后发布了 2024 年第三财年报告&#xff08;截止 2023 年 12 月&#xff09;&#xff0c;要点如下&#xff1a; 1、整体业绩&#xff1a;收入再创新高。ARM 在 2024 财年第三季度&#xff08;即 23Q4…

python-pandas查漏补缺

1. create labels for Series 2. 3. 4. 用平均数等去填empty的格子 5. 6. 7.

旅游|基于Springboot的旅游管理系统设计与实现(源码+数据库+文档)

旅游管理系统目录 目录 基于Springboot的旅游管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户管理 2、景点分类管理 3、景点信息管理 4、酒店信息管理 5、景点信息 6、游记分享管理 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&#xf…

037 稀疏数组

代码示例 /*** 生成稀疏数组* param arr 原数组* param defaultValue 数组默认值* return*/ static int[][] extractArray(int[][] arr, int defaultValue) {// 统计有多少个非默认值int count 0;for (int i 0; i < arr.length; i) {for (int j 0; j < arr[i].lengt…

谷歌发布AI新品Gemini及收费模式;宜家推出基于GPT的AI家装助手

&#x1f989; AI新闻 &#x1f680; 谷歌发布AI新品Gemini及收费模式 摘要&#xff1a;谷歌宣布将原有的AI产品Bard更名为Gemini&#xff0c;开启了谷歌的AI新篇章。同时推出了强化版的聊天机器人Gemini Advanced&#xff0c;支持更复杂的任务处理&#xff0c;提供了两个月的…

Mysql Day03

多表设计 一对多 在多的一方添加外键约束&#xff0c;关联另外一方主键 一对一 任意一方添加外键约束&#xff0c;关联另外一方主键 多对多 建立第三张中间表&#xff0c;中间表至少包含两个外键&#xff0c;分别关联两方主键 idstu_idcourse_id 1 11 2 12313421524 案…

融资项目——获取树形结构的数据

如下图所示&#xff0c;下列数据是一个树形结构数据&#xff0c;行业中包含若干子节点。表的设计如下图&#xff0c;设置了一个id为1的虚拟根节点。&#xff08;本树形结构带虚拟根节点共三层&#xff09; 实现逻辑&#xff1a; 延时展示方法&#xff0c;先展现第二层的信息&a…

机器学习8-决策树

决策树&#xff08;Decision Tree&#xff09;是一种强大且灵活的机器学习算法&#xff0c;可用于分类和回归问题。它通过从数据中学习一系列规则来建立模型&#xff0c;这些规则对输入数据进行递归的分割&#xff0c;直到达到某个终止条件。 决策树的构建过程&#xff1a; 1.…

2024年生成式AI芯片市场规模将达500亿美元

1月24日&#xff0c;德勤发布《2024科技、传媒和电信行业预测》中文版报告&#xff0c;2024年是科技、传媒和电信行业关键的一年&#xff0c;不少科技公司正利用生成式AI升级软件和服务&#xff0c;预计今年全球生成式人工智能芯片销售额可能达到500亿美元以上。 2024年将有许…

【开源】基于JAVA+Vue+SpringBoot的智慧社区业务综合平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 业务类型模块2.2 基础业务模块2.3 预约业务模块2.4 反馈管理模块2.5 社区新闻模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 业务类型表3.2.2 基础业务表3.2.3 预约业务表3.2.4 反馈表3.2.5 社区新闻表 四、系统展…

Mysql一行记录存储过程

Mysql一行记录存储过程 Mysql的文件架构 行&#xff08;row&#xff09; 数据库表中的记录都是行存放的&#xff0c;每行继续根据不同的行格式都有不同的存储结构。 页&#xff08;page&#xff09; 记录是按照行来存储的&#xff0c;但是数据库的读取是以页为单位的&…

python-基础篇-列表-脚本

文章目录 01_下标.py02_查找.py03_判断是否存在.py04_体验案例判断是否存在.py05_列表增加数据之append.py06_列表增加数据之extend.py07_列表增加数据之insert.py08_列表删除数据.py09_列表修改数据.py10_列表复制数据.py11_列表的循环遍历之while.py12_列表的循环遍历之for.p…

Linux 存储管理(磁盘管理、逻辑卷LVM、交换分区swap)

目录 1.磁盘管理 1.1 磁盘简介 1.2 管理磁盘 添加磁盘 管理磁盘流程三步曲 1.查看磁盘信息 2.创建分区 3.创建文件系统 4.挂载mount 5.查看挂载信息 6.MBR扩展分区 7.重启后的影响 2.逻辑卷LVM 2.1 简介 ​​​​​​2.2 创建LVM 2.3 VG管理 2.4 LV管理实战-在…