【带头学C++】----- 九、类和对象 ---- 9.10 C++设计模式之单例模式设计

❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️麻烦您点个关注,不迷路❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️

目 录

9.10 C++设计模式之单例模式设计

   举例说明:


9.10 C++设计模式之单例模式设计

看过我之前的文章的,简单讲解过C++/Qt的设计模式。简单回顾一下:
回看设计模式章节点这里icon-default.png?t=N7T8https://blog.csdn.net/Phofomy/article/details/131247977?spm=1001.2014.3001.5502

不想回看???我在下面放个截图,简单回顾一下吧~

        实际上Qt的设计模式和C++基本上相差无几,Qt就是C++的图形GUI库,其底层实现完全结合了C++的知识,可以直接使用C++进行混合编程,那看完了Qt的相关的设计模式介绍,那么我们接下来,主要学习的是C++中单例设计模式的一些基本概念和实现;

首先:C++单例设计模式是什么?

根据图中:单例模式是一个类只有一个实例,那c++呢?其实是大同小异的!

        C++ 单例设计模式是一种用于创建只能有一个实例的类的软件设计模式。它确保一个类只有一个实例,并提供了一个全局访问该实例的访问点。

        在单例模式中,类的构造函数必须是私有的,以防止在类的外部对其进行实例化。通过使用一个静态方法或静态成员函数来创建类的唯一实例,然后每次调用该方法时返回相同的实例。

   举例说明:

class Singleton {
private:// 私有化构造函数,以防止在类的外部实例化该类Singleton() {}public:// 获取单例实例的静态成员函数static Singleton& getInstance() {// 使用静态局部变量确保只有一个实例被创建static Singleton instance;return instance;}
};

        C++单例设计模式实际上在开发过程中,也是比较常用的设计模式之一。使用单例模式,可以保证在整个程序执行期间只有一个类的实例存在,从而确保全局共享和唯一性。这在需要创建唯一资源或共享状态的情况下非常有用,例如数据库连接、日志记录器或全局配置对象等。

        单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案;

案例: 实现一个单例模式

代码:

#include <iostream>using namespace std;
class Singleton{ //单例模式
private://构造私有化 防止实例化其他对象 将构造函数私有化,外界无法构造函数Singleton(){count=0;cout<<"构造"<<endl;}Singleton(const Singleton &ob){count=0;}~Singleton(){cout<<"析够"<<endl;}
private://第二步:定义一个静态的指针变量保存唯一实例的地址//const防止p 在类内部 被修改指向static Singleton * const p;//保存唯一的实例地址int count;//统计任务执行次数
public://第三步: 获取唯一的实例地址static Singleton * getSingleton(void){return p;}//第四步:实现用户自定义的操作函数void printString(const char *str){cout << "打印:"<<str<<endl;}
};//这一步也很重要,初始化一个单例实例指针
Singleton * const Singleton::p = new Singleton;void test01(){Singleton *p1 = Singleton::getSingleton();p1->printString("离职证明p1_1");p1->printString("身份证明p1_2");p1->printString("学历证明p1_3");Singleton *p2 = Singleton::getSingleton();p2->printString("离职证明p2_1");//按住alt鼠标下拉可以同时修改一列p2->printString("身份证明p2_2");p2->printString("学历证明p2_3");
}
int main()
{test01();return 0;
}

        注意:在多线程环境下,需要考虑线程安全性,并采取适当的线程安全措施来保护单例实例的创建和访问。

代码:

class Singletons {
private:// 将构造函数和拷贝构造函数设为私有,以防止在类的外部实例化该类或进行拷贝构造Singletons() {}Singletons(const Singletons&) {}static Singletons* instance; // 单例实例的指针public:// 获取单例实例的静态成员函数static Singletons& getInstance() {// 使用双重检查锁定确保线程安全if (instance == nullptr) {// 加锁// ...if (instance == nullptr) {instance = new Singletons();}// 解锁// ...}return *instance;}void printMessage() {std::cout << "Hello, Singleton!" << std::endl;}
};Singletons* Singletons::instance = nullptr; // 初始化单例实例指针为空void test02() {Singletons& singleton = Singletons::getInstance(); // 获取单例实例singleton.printMessage(); // 调用打印方法
}

以上,就是我们对C++的单例设计模式一个学习内容,看完的小伙伴记得去敲一遍代码试试哦。

点赞👍  + 收藏👐 + 关注👌

❤️您的支持❤️,是博主最大的动力❤️!!互相学习❤️!!共同进步❤️!!一起搞钱❤️!!❤️

 ❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️

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

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

相关文章

Python:核心知识点整理大全8-笔记

目录 ​编辑 4.5 元组 4.5.1 定义元组 dimensions.py 4.5.2 遍历元组中的所有值 4.5.3 修改元组变量 4.6 设置代码格式 4.6.1 格式设置指南 4.6.2 缩进 4.6.3 行长 4.6.4 空行 4.6.5 其他格式设置指南 4.7 小结 第5章 if语句 5.1 一个简单示例 cars.py 5.2 条…

Kafka快速实战以及基本原理详解

文章目录 一、Kafka介绍为什么要用Kafka 二、Kafka快速上手实验环境单机服务体验 三、理解Kakfa的消息传递机制四、Kafka集群服务五、理解服务端的Topic、Partition和Broker七、Kafka集群的整体结构八、Kraft集群Kraft集群简介配置Kraft集群 一、Kafka介绍 ChatGPT对于Apache …

探索HarmonyOS开发—Slider滑动条组件

Slider Slider 滑块组件 Slider({min: 0, // 最小值max: 350, // 最大值value: 30, // 当前值step:10, // 滑动步长style:SliderStyle.OutSet, // Inset 滑块的位置direction:Axis.Horizontal, // Verticalreverse:false // 是否反向滑动 }) style属性可以控制滑块在整个滑块…

元宇宙vr党建云上实景展馆扩大党的影响力

随着科技的飞速发展&#xff0c;VR虚拟现实技术已经逐渐融入我们的日常生活&#xff0c;尤其在党建领域&#xff0c;VR数字党建展馆更是成为引领红色教育新风尚的重要载体。今天&#xff0c;就让我们一起探讨VR数字党建展馆如何提供沉浸式体验&#xff0c;助力党建工作创新升级…

使用STM32 HAL库进行GPIO控制的实例

✅作者简介&#xff1a;热爱科研的嵌入式开发者&#xff0c;修心和技术同步精进&#xff0c; 代码获取、问题探讨及文章转载可私信。 ☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。 &#x1f34e;获取更多嵌入式资料可点击链接进群领取&#xff0c;谢谢支持&#xff01;…

通过误差改变控制的两种策略

如果反馈误差越来越大&#xff0c;需要改变调节方向以减小误差并实现更好的控制。以下是两种常见的调节方向改变的方法&#xff1a; PID控制器中的积分限制&#xff1a;在PID控制中&#xff0c;积分项可以用来减小稳态误差。然而&#xff0c;当反馈误差持续增大时&#xff0c;积…

28、pytest实战:获取多用户鉴权

前提 测试过程中有用户体系&#xff0c;例如包括管理员、商家、用户角色&#xff0c;不同测试用例需要使用不同角色来操作&#xff0c;操作权限根据用户的鉴权来判断实现。 技能点 建立全局变量文件&#xff0c;保存账号相关信息获取鉴权信息变为module级别fixture&#xff…

Kafka在微服务架构中的应用:实现高效通信与数据流动

微服务架构的兴起带来了分布式系统的复杂性&#xff0c;而Kafka作为一款强大的分布式消息系统&#xff0c;为微服务之间的通信和数据流动提供了理想的解决方案。本文将深入探讨Kafka在微服务架构中的应用&#xff0c;并通过丰富的示例代码&#xff0c;帮助大家更全面地理解和应…

鸿蒙开发—学习声明式UI

基本UI描述 ArkTS通过装饰器Component和Entry装饰struct关键字声明的数据结构&#xff0c;构成一个自定义组件。自定义组件中提供了一个build函数&#xff0c;开发者需在该函数内以链式调用的方式进行基本的UI描述&#xff0c;UI描述的方法请参考UI描述规范。 基本概念 stru…

UWB的matlab仿真源码

作品详细文章与下载链接 第一部分:TR-UWB信号的产生和调制 简介 该实践涉及使用 MATLAB 生成和调制 TR-UWB 信号。超宽带信号是一类在频谱中具有宽带而不是窄带的信号信号&#xff0c;具有时间宽度的脉冲产生它。在本次实践中,MATLAB 程序是开发用于生成基带 TR-UWB 信号,我们用…

关于idea2023创建项目时怎么使用jdk8

最近用idea创建项目时&#xff0c;发现java的版本只能选择17或22&#xff0c;springboot的版本只能选择3.2.0&#xff1a; 那么&#xff0c;如果我们要用jdk8和springboot2的话&#xff0c;那要怎么做呢&#xff1f; 不急&#xff0c;我们先点击create创建项目&#xff0c;然后…

Spring--10--Spring Bean的生命周期

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.Spring Bean1.1 什么是 Bean简而言之&#xff0c;bean 是由 Spring IoC 容器实例化、组装和管理的对象。 1.2 Spring框架管理Bean对象的优势 2.Bean的生命周期实例…