设计模式之单例模式入门介绍
一、设计模式概念
设计模式是被广泛使用的软件开发中的一种解决方案,它提供了一套被验证过的、可重用的设计思想,帮助开发人员更加高效地开发出可维护、易扩展的软件系统。
设计模式可以分为三类:创建型模式、结构型模式和行为型模式。
1.1 创建型模式
创建型模式用于描述对象的创建过程,它的目的是封装对象的创建过程,从而降低系统的耦合度,并且能够更加灵活地创建对象。创建型模式包括单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式等。
1.2 结构型模式
结构型模式用于描述如何将类或对象按某种布局组成更大的结构,它涉及到接口和类的组合。结构型模式包括适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式和代理模式等。
1.3 行为型模式
结构型模式用于描述如何将类或对象按某种布局组成更大的结构,它涉及到接口和类的组合。结构型模式包括适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式和代理模式等。
二、单例模式概念
单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点。
1.将构造函数私有化:将类的构造函数设为私有,这样外部就无法通过构造函数来创建该类的对象。
2.提供一个静态成员变量来保存唯一实例:在该类中定义一个静态成员变量,用于保存该类的唯一实例。
3.提供一个静态方法来获取唯一实例:在该类中定义一个静态方法,用于获取该类的唯一实例。在该方法中,判断静态成员变量是否为空,如果为空,则创建一个新的对象并赋值给静态成员变量,然后返回该静态成员变量。
4.禁止复制构造函数和赋值运算符:为了避免从已有对象派生出新的对象,需要将复制构造函数和赋值运算符定义为私有或删除函数。
通过上述方法可以使单例类只有一个对象,全局只有一个实例对象存在,通过静态接口来获取该实例
2.1 饿汉模式:
饿汉模式就像有种饿叫做你妈妈/奶奶觉得你饿,不管你真饿假饿 我都把饭给你做好,饿汉模式也一样,我直接把单例对象给你初始化好,完了你直接用就可以了
代码示例:
class Singleton {
public:static Singleton* getInstance() { //获取单例对象的静态接口return instance;}
private:static Singleton* instance;//静态对象Singleton() {}//构造、拷贝构造、赋值设置为私有Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;
};Singleton* Singleton::instance = new Singleton(); //类加载之后就直接初始化,饿汉模式
2.2 懒汉模式:
懒汉模式就是比较懒,有人要获取单例对象我才来实例化,踢一脚走一步的那种
代码示例:
class Singleton {
public:static Singleton* getInstance() { //获取单例对象的静态接口if (instance == nullptr)//如果单例对象没有初始化,则进行初始化{instance = new Singleton();}return instance;}
private:static Singleton* instance;//静态对象Singleton() {}//构造、拷贝构造、赋值设置为私有Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;
};
Singleton*Singleton::instance = nullptr; //初始化为 nullptr
有了代码,那当然要试一试单例模式怎么玩,验证一下是不是真的只有一个单例对象:

可以看到,单例对象是唯一的
2.3 单例模式验证测试
2.3.1 饿汉模式
代码示例:
#include<iostream>
using namespace std;class Singleton {
public:static Singleton* getInstance() { //获取单例对象的静态接口return instance;}void Print(){cout << "hello world" << endl;}
private:static Singleton* instance;//静态对象Singleton() {}//构造、拷贝构造、赋值设置为私有Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;
};Singleton* Singleton::instance = new Singleton(); //类加载之后就直接初始化,饿汉模式
int main()
{//1.构造对象试试Singleton sin;//报错构造函数私有化,无法在类外实例化出对象return 0;
}
那么如何去调用这个单例类里面的方法呢?
//调用静态方法获取单例对象(单例对象指针) 然后调用单例类中的成员函数
Singleton::getInstance()->Print();
运行结果:

三、单例模式是线程安全的吗?
我们考虑这样一个场景,两个线程,懒汉模式下,同时去获取这个单例对象,那么在获取单例对象之前,都是nullptr ,那么都会同时去 new 一个单例对象,导致会创建多个单例对象,那么就无法实现单例模式单例对象唯一的特点
我们可以通过加锁来解决该问题:
#include <mutex>class Singleton {
private:static Singleton* instance;static std::mutex mtx;Singleton() {}public:static Singleton* getInstance() {if (instance == nullptr) { // 第一次检查是否为空std::lock_guard<std::mutex> lock(mtx); // 加锁保证线程安全if (instance == nullptr) { // 第二次检查是否为空instance = new Singleton();}}return instance;}// 禁止拷贝构造函数和赋值运算符Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;
};Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;
当然了 饿汉模式是线程安全的,因为单例类对象在类加载完就进行了实例化,通过静态接口获取单例对象时直接获取即可,无需初始化。
相关文章:
设计模式之单例模式入门介绍
一、设计模式概念 设计模式是被广泛使用的软件开发中的一种解决方案,它提供了一套被验证过的、可重用的设计思想,帮助开发人员更加高效地开发出可维护、易扩展的软件系统。 设计模式可以分为三类:创建型模式、结构型模式和行为型模式。 1.1…...
RHCE 作业三
1.基于域名访问网站 [rootserver ~]# setenforce 0 [rootserver ~]# systemctl stop firewalld [rootserver ~]# systemctl disable firewalld [rootserver ~]# yum install httpd -y [rootserver ~]# systemctl start httpd [rootserver ~]# syst…...
90.qt qml-Table表格组件(支持表头表尾固定/自定义颜色/自定义操作按钮/插入排序)
众所周知,qml table在目前版本还很废,qt5的table完全就没法用,在之前章节就写过: 88.qt qml-TableView学习(一)_诺谦的博客-CSDN博客 所以本章便参考VUE-Element的Table外观组件实现一个可排序可操作的Table组件. 1.组件介绍 GIF如下所示: 排序支持数字和字符串排序。 …...
android 12.0SystemUI屏蔽某个app的通知
1.概述 在12.0的产品开发中,对于系统的通知部分,要求根据app包名来过滤掉一部分通知,就是在接收到系统通知时,根据包名判断是否需要接收通知的功能,首选要分析通知流程,然后实现功能 2.SystemUI屏蔽某个app的通知相关代码 frameworks\base\packages\SystemUI\src\com\…...
注意力机制(一)SE模块(Squeeze-and-Excitation Networks)论文总结和代码实现
Squeeze-and-Excitation Networks(压缩和激励网络) 论文地址:Squeeze-and-Excitation Networks 论文中文版:Squeeze-and-Excitation Networks_中文版 代码地址:GitHub - hujie-frank/SENet: Squeeze-and-Excitation Ne…...
L2-001 紧急救援(dijkstra算法练习)
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的…...
redis问题汇总
redis的优点 读写性能优异。十万/s的量级; 支持数据持久化。AOF,RDB 支持丰富的数据类型; 支持集群,可以实现主从复制,哨兵机制迁移,扩容等 缺点: 因为是基于内存的,所以虽然redis本身有key过期…...
调用华为API实现情感分析
作者介绍 王新华,男,西安工程大学电子信息学院,2022级研究生 研究方向:人工智能与模式识别 电子邮件:996514274qq.com 魏小双,女,西安工程大学电子信息学院,2022级研究生 研究方向…...
C# 静态构造函数
静态构造函数用于初始化任何静态数据,或执行仅需要执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,将自动调用它。 静态构造函数是在构造函数方法前面添加了static关键字之后形成的,并且没有修饰符(public,private),没有参数。…...
【C++】哈希表特性总结及unordered_map和unordered_set的模拟实现
✍作者:阿润菜菜 📖专栏:C 文章目录 前言一、哈希表的特性 - 哈希函数和哈希冲突1 哈希函数2. 哈希冲突 二、闭散列的实现 -- 开放地址法1. 定义数据结构2.insert()3.Find()4. Erase()5.仿函数处理key值不能取模无法映射 --- BKDRHash 三、开…...
Qt在Linux内核中的应用及解析(qtlinux内核)
Qt是跨平台开发的一种工具,尤其适合在Linux内核中的应用开发中使用。Qt能够让开发者在Linux桌面上开发出强大的图形化应用程序,为Linux系统用户提供更加人性化、实用、智能化的服务。本文将从Qt在Linux内核中的应用场景、应用程序开发中的具体使用、以及…...
Xpdf 阅读器源码编译后查看文件中文乱码问题解决
经查阅,是由于缺少中文字体包: 第一步:下载所需要的字体包 下载https://dl.xpdfreader.com/xpdf-t1fonts.tar.gz 包含下载中文字体包(非嵌入字体) http://ftp.gnu.org/gnu/non-gnu/chinese-fonts-truetype/gkai00mp…...
Java - AQS-CountDownLatch实现类(二)
前言 在Java中,AbstractQueuedSynchronizer(简称AQS)是一个用于实现同步器的抽象类,它为实现各种类型的同步器(如锁、信号量等)提供了基本的框架。AQS通过一个双向队列(等待队列)和…...
rsut基础
这篇文章是实战性质的,也就是说原理部分较少,属于经验总结,rust对于模块的例子太少了。rust特性比较多(悲),本文的内容可能只是一部分,实现方式也不一定是这一种。 关于 rust 模块的相关内容&a…...
高压放大器和示波器的关系是什么
高压放大器和示波器是电子工程领域中常见的两种设备,它们在实际的电路设计、测试和分析中都扮演着重要的角色。下面安泰电子将从定义、功能、应用场景等方面为您介绍高压放大器和示波器的关系。 图:ATA-7000系列高压放大器 一、高压放大器的定义及功能 高…...
5个超实用视频素材网站,免费下载~
推荐几个高清无水印的视频素材网站,重点是可以免费下载使用,建议收藏! 菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 可以称之为最大素材库,在这里你可以找到设计、办公、图片、视频、音频等各种素材。视频素材就有…...
【NLP模型】文本建模(1)(BoW、N-gram、tf-idf)
目录 一、说明 二、BoW模型产生发展 2.1 产生和历史 2.2 原理介绍 三、具体实现...
Java——网络编程套接字
目录 一、网络编程基础 1.1 为什么需要网络编程?——丰富的网络资源 二、什么是网络编程? 三、网络编程中的基本概念 3.2 请求和响应 3.3 客户端和服务端 常见的客户端服务端模型 四、Socket套接字 五、通信模型 5.1 Java数据报套接字通信模型 5.2 Java流…...
160套小程序源码
源码列表如下: AppleMusic (知乎日报) 微信小程序 d artand 今日更新求职招聘类 医药网 口碑外卖点餐 城市天气 外卖小程序 定位天气 家居在线 微信小程序-大好商城,wechat-weapp 微信小程序的掘金信息流 微信跳一跳小游戏源码 微票源码-demo 急救应急处…...
有效项目进度管理的 10 条规则
项目进度管理是项目中比较关键的方面之一,因为它将决定事情的进展方式、进展速度以及是否会取得进展。换句话说,它可以让你较好地控制项目,帮助你预测不可预测的情况,并使所有相关团队能够高效地协同工作。 以下是有效项目进度管…...
天赐范式第53天:当伙伴没有上下文的时候——说我皮肤好~算子包装
我是第一天就开始包装算子用来算CFD的吗,这套技术理论不是多个领域模拟击穿的吗?没发论文就说没发论文,别扯没用的~谁生下来就会叫爸爸呀!伙伴:兄弟,我建议认栽,切回v27 MAC版:bashd…...
iOS HTTPS抓包全链路指南:从Charles配置到SSL Pinning绕过
1. 为什么iOS HTTPS抓包比安卓难得多?——从SSL Pinning到系统证书信任链的硬门槛很多人第一次在Mac上打开Charles,连上iPhone,点开App发现一片空白:没有请求、没有响应、全是unknown。不是Charles坏了,也不是手机没连…...
Unity安卓游戏开发实战:从构建失败到上线合规的工程化路径
1. 为什么“精通Unity安卓游戏开发”不是一句口号,而是一道必须拆解的工程题很多人看到“精通Unity安卓游戏开发”这个标题,第一反应是:不就是用Unity写个游戏,然后点一下Build Android?我做过三个小游戏,打…...
JEECG-Boot企业级接口防重与并发控制:双引擎保障系统稳定性的实战指南
JEECG-Boot企业级接口防重与并发控制:双引擎保障系统稳定性的实战指南 【免费下载链接】jeecg-boot AI 低代码平台,「低代码 零代码」双模式驱动:低代码一键生成前后端代码,零代码 5 分钟搭建系统,AI Skills 一句话画…...
June安全防护手册:保护你的论坛免受常见Web攻击的10个技巧
June安全防护手册:保护你的论坛免受常见Web攻击的10个技巧 【免费下载链接】june June is a forum (Deprecated) 项目地址: https://gitcode.com/gh_mirrors/ju/june 在当今数字时代,论坛安全防护已成为每个网站管理员必须面对的重要课题。June作…...
GCN vs MLP:在Cora数据集上,图神经网络到底强在哪?(附可视化对比)
GCN与MLP在Cora数据集上的本质差异:从特征聚合到空间重构的认知升级当我们面对学术文献分类任务时,传统机器学习方法往往将每篇文献视为独立个体进行处理。这种处理方式在Cora数据集上通常只能获得约50%的分类准确率,而图卷积网络(GCN)却能轻…...
告别默认图表:手把手教你定制VASPKIT的PLOT.In文件,画出符合期刊要求的能带图
科研绘图进阶:深度定制VASPKIT能带图的专业技巧在学术论文写作中,一张精心设计的能带图往往能成为研究成果的视觉名片。VASPKIT作为材料计算领域的利器,其自动绘图功能虽然便捷,但默认输出往往难以满足高端期刊的审美要求。本文将…...
Nature|619372人循环代谢性状的遗传分析
尽管复杂疾病的全基因组关联研究(GWAS)通常会分析多达100多万人,但分子特征的研究却滞后了。在这里,研究对爱沙尼亚生物库和英国生物库中多达619,372名个体的249个循环代谢特征进行了GWAS荟萃分析。从8,398个趋同于共享基因和通路…...
CVE二进制工具:无源码漏洞检测的原理与实战
1. 这不是又一个“扫扫就完事”的漏洞扫描器很多人第一次听说“CVE二进制工具”时,下意识会把它和常见的Web漏洞扫描器(比如Nessus、OpenVAS)划等号——点几下鼠标,跑个任务,出份PDF报告,然后发给安全部门交…...
【前端无障碍】无障碍测试:确保你的应用对所有人友好
【前端无障碍】无障碍测试:确保你的应用对所有人友好 前言 大家好,我是cannonmonster01!今天咱们来聊聊无障碍测试这个话题。无障碍设计不仅仅是开发阶段的事情,测试阶段同样重要。只有通过全面的测试,才能确保你的应用…...
