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…

C#既然数组长度不可改变,那么如何动态调整集合类型数组大小,以便添加或删除元素?

目录 1.使用动态数组&#xff08;ArrayList&#xff09;&#xff1a; 2.使用 jagged array&#xff08;不规则数组&#xff09;&#xff1a; 3.使用 List &#xff1a; 4.使用数组复制&#xff1a; 在C#中&#xff0c;数组的长度是固定的&#xff0c;一旦声明和初始化&…

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;用来在组件树中协调对异步依赖的处理。它让我们可以在组件树上层等待下层的多个嵌…

【前端高频面试题--Vue3.0篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;前端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 高频前端面试题--Vue3.0篇 Vue3.0有什么更新defineProperty和proxy的区别Vue3.0 为什么要用 pro…

[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…

Docker-CE 国内源国内镜像

Docker-CE 就是 Docker Community Edition 的意思 docker-ce由docker官方维护 , docker.io由Debian维护 Docker官文 – Install Docker Engine on CentOS Docker官文 – Install Docker Engine on Fedora Docker官文 – Install Docker Engine on Debian Docker官文 – In…

k8s学习-Kubernetes Ingress

1.1 什么是Ingress&#xff1f; 首先我们来思考用传统的web服务器&#xff0c;比如Nginx&#xff0c;如何处理这种场景&#xff1f; 比如使用Nginx充当一个反向代理服务器拦截外部请求&#xff0c;读取路由规则配置&#xff0c;转发相应的请求到后端服务。 kubernetes处理这种…

python-pandas查漏补缺

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

巴尔加瓦算法图解【完结】:算法运用(下)

目录 布隆过滤器HyperLogLogSHA算法比较文件检查密码 Diffie-Hellman密钥交换线性规划结语&#xff08;完结&#xff09; 布隆过滤器 在元素很多的情况下&#xff0c;判断一个元素是否在集合中可以使用布隆过滤器。布隆过滤器&#xff08;Bloom Filter&#xff09;是 1970 年由…

旅游|基于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…

【算法训练营】栈,队列,二叉树习题1-1(python实现)

栈 描述 实现一个栈&#xff0c;完成以下功能&#xff1a; 入栈出栈询问栈中位置Y是谁 一开始栈为空。栈中的位置从1开始&#xff08;即栈底位置为1&#xff09;。 输入 第一行一个整数n&#xff0c;表示操作个数。 接下来n行&#xff0c;每行第一个数字表示操作&#xff08;见…

软考网工笔记1:计算机网络的形成和发展

计算机网络的形成和发展 一、早期的计算机网络 1、1951年&#xff0c;美国麻省理工学院林肯实验室就开始为美国空军设计称为 SAGE 的半自动化地面防空系统&#xff0c;该系统最终于1963年建成&#xff0c;被认为是计算机和通信技术结合的先驱。 2、美国航空公司与 IBM公司在…

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

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

C++服务器端开发(10):性能优化

选择合适的数据结构和算法&#xff1a;使用适当的数据结构和算法可以极大地提高服务器的性能。例如&#xff0c;使用哈希表来快速访问和检索数据&#xff0c;使用平衡二叉树来维护有序的数据等。 减少内存分配和释放&#xff1a;频繁的内存分配和释放操作会导致性能下降。可以…