创建型设计模式:3、单例模式(C++实现实例 线程安全)
目录
1、单例模式(Singleton Pattern)的含义
2、单例模式的优缺点
(1)优点:
(2)缺点:
3、C++实现单例模式的示例(简单)
4、C++实现单例模式的示例(实际项目中使用)
(1)构造一个单例基类(无线程安全)
(2)构造一个单例基类(二次保证线程安全)
(3)目标类成为单例类,继承这个单例类即可
(4)如何使用这个目标单例类
1、单例模式(Singleton Pattern)的含义
(1)单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。
(2)单例模式的主要目的是限制一个类的实例化次数,以便在整个应用程序中共享该实例。它常用于需要全局访问某个对象的场景,例如日志记录器、数据库连接池等。
2、单例模式的优缺点
(1)优点:
1)全局访问:单例模式可以提供一个全局访问点,使得其他对象可以方便地访问该实例。
2)节省资源:由于单例模式只创建一个实例,可以节省系统资源,特别是在需要频繁创建和销毁对象的场景下。
3)数据共享:单例模式可以实现数据的共享,多个对象可以共享同一个实例,避免了数据不一致的问题。
4)延迟实例化:单例模式可以延迟实例化,即在第一次使用时才创建实例,提高了系统的性能和效率。
(2)缺点:
1)难以扩展:由于单例模式只允许存在一个实例,因此扩展时可能会受到限制。
2)违反单一职责原则:单例模式将创建实例和业务逻辑耦合在一起,违反了单一职责原则,增加了代码的复杂性和维护成本。
3)对象生命周期管理困难:由于单例模式的实例在整个应用程序的生命周期中存在,因此对其生命周期的管理可能较为困难。
4)可能引发线程安全问题:在多线程环境下,如果没有正确处理并发访问的情况,可能会引发线程安全问题。
因此,在使用单例模式时需要权衡其优缺点,并根据具体的业务需求和场景来决定是否使用。
3、C++实现单例模式的示例(简单)
class Singleton
{
private:static Singleton* instance; // 静态成员变量,保存唯一实例的指针// 将构造函数和拷贝构造函数声明为私有,防止外部直接实例化和复制对象Singleton() {}Singleton(const Singleton& other) {}public:static Singleton* getInstance(){if (instance == nullptr){instance = new Singleton();}return instance;}void someMethod() {// 单例类的其他方法}
};Singleton* Singleton::instance = nullptr; // 初始化静态成员变量int main()
{Singleton* obj1 = Singleton::getInstance(); // 获取单例实例obj1->someMethod(); // 调用单例对象的方法Singleton* obj2 = Singleton::getInstance(); // 再次获取单例实例,与obj1相同return 0;
}
在上述示例中,通过将构造函数和拷贝构造函数声明为私有,外部无法直接实例化和复制对象。通过静态成员变量instance
保存唯一实例的指针,并提供静态方法getInstance()
来获取该实例。
4、C++实现单例模式的示例(实际项目中使用)
(1)构造一个单例基类(无线程安全)
/*
单例类
*/
#pragma once
#include <map>
#include <string>
#include <vector>
using namespace std;template <typename T>
class SingleTon
{
public:static T* getInstance(){if (NULL == m_pInstance){//m_singleCS.Lock();if (NULL == m_pInstance){m_pInstance = new T();}//m_singleCS.Unlock();}return m_pInstance;}protected:SingleTon(void){}virtual ~SingleTon(void){if (NULL != m_pInstance){delete m_pInstance;m_pInstance = NULL;}}static T* m_pInstance;private:SingleTon(const SingleTon&);SingleTon& operator = (const SingleTon&);
};template <typename T>
T* SingleTon<T>::m_pInstance = NULL;
(2)构造一个单例基类(二次保证线程安全)
/** @Description: 单例类工厂* @Author: Ivy* @Date: 2023-05-09 09:34:43* @LastEditTime: 2023-02-24 11:28:29* @LastEditors: XTZJ-2022OQEHLZ*/
#pragma once
#include <vector>
#include <string>
#include <iostream>
#include <QMutex>using namespace std;
template <typename T>
class Singleton
{
public:static T* getInstance(){if (m_pInstance == NULL){// 二次保证线程安全m_pMutexCreate.lock();if (m_pInstance == NULL){m_pInstance = new T();}m_pMutexCreate.unlock();}return m_pInstance;}// 尽量多的将单例共有的方法放到基类,子类继承即可virtual void startWork() {}
protected:Singleton() {}virtual ~Singleton(){if (m_pInstance != NULL){delete [] m_pInstance;m_pInstance = NULL;}}static T* m_pInstance;static QMutex m_pMutexCreate;QMutex m_mutex;
private:Singleton(const Singleton&);Singleton& operator =(const Singleton&);public:void lock() { m_mutex.lock(); }void unLock() { m_mutex.unlock(); }
};template <typename T>
QMutex Singleton<T>::m_pMutexCreate;template <typename T>
T* Singleton<T>::m_pInstance = NULL;
(3)目标类成为单例类,继承这个单例类即可
/** @Description: XXX 管理类*/
#pragma once
#include "Singleton.h"class testManager : public Singleton<testManager>
{friend class Singleton<testManager>;//要声明友元类public:virtual ~testManager();void getData();void setData();private:testManager();
}
(4)如何使用这个目标单例类
// 实例演示:包含该类的头文件
testManager::getInstance()->getData();
相关文章:

创建型设计模式:3、单例模式(C++实现实例 线程安全)
目录 1、单例模式(Singleton Pattern)的含义 2、单例模式的优缺点 (1)优点: (2)缺点: 3、C实现单例模式的示例(简单) 4、C实现单例模式的示例ÿ…...

JavaWeb学习笔记
Maven:自动导入配置jar包。 Maven项目架构管理工具:核心思想:约定大于配置 Maven:环境优化 1.修改web.xml为最新的 <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee&…...

ad+硬件每日学习十个知识点(24)23.8.4(时序约束,SignalTap Ⅱ)
文章目录 1.建立时间和保持时间2.为什么要建立时序约束?3.SignalTap Ⅱ4.SignalTap Ⅱ使用方法5.HDL的仿真软件(modelsim)6.阻抗匹配 1.建立时间和保持时间 答: 2.为什么要建立时序约束? 答: 3.Sign…...

FortiGate防火墙日志审计运维
环境介绍 CPU:8核,内存:16GB,硬盘:100GB 操作系统版本:CentOS-7-x86_64-DVD-2003 平台版本:鸿鹄2.7.0 安装组件 安装环境支持确认 鸿鹄计算引擎使用了 AVX2 高级指令集做向量计算加速…...

基于yolo v5与Deep Sort进行车辆以及速度检测与目标跟踪实战
项目实验结果展示: 基于yolo v5与Deep Sort进行车辆以及速度检测与目标跟踪实战——项目可以私聊 该项目可以作为毕业设计,以及企业级的项目开发,主要包含了车辆的目标检测、目标跟踪以及车辆的速度计算,同样可以进行二次开发。 …...

以指标驱动,保险、零售、制造企业开启精益敏捷运营的新范式
近日,以“释放数智生产力”为主题的 Kyligence 用户大会在上海前滩香格里拉大酒店成功举行。大会包含上午的主论坛和下午的 4 场平行论坛,并举办了闭门会议、Open Day 等活动。来自金融、零售、制造、医药等行业的客户及合作伙伴带来了超过 23 场主题演讲…...

MyBatis-动态SQL-foreach
目录 标签有以下常用属性: 小结 <froeach> <foreach>标签有以下常用属性: collection:指定要迭代的集合或数组的参数名(遍历的对象)。item:指定在迭代过程中的每个元素的别名(遍历…...

VUE框架:vue2转vue3全面细节总结(3)路由组件传参
大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人_python人工智能视觉(opencv)从入门到实战,前端,微信小程序-CSDN博客 最新的uniapp毕业设计专栏也放在下方了: https://blog.csdn.net/lbcy…...

音视频技术开发周刊 | 305
每周一期,纵览音视频技术领域的干货。 新闻投稿:contributelivevideostack.com。 大神回归学界:何恺明宣布加入 MIT 「作为一位 FAIR 研究科学家,我将于 2024 年加入麻省理工学院(MIT)电气工程与计算机科学…...

vue 图片base64转化
import html2canvas from ‘html2canvas’ html2canvas(canvasDom, options).then(canvas > { //此时的图片是base64格式的,我们将图片格式转换一下 let type ‘png’; let imgData canvas.toDataURL(type); // 照片格式处理 let _fixType function(type) { …...

TS学习03-类
类 calss A {name: stringconstructor(name:string) {this.name name}greet() {return hello, this.name} } let people new A(RenNing)继承 子类是一个派生类,他派生自父类(基类),通过 extends关键字 派生类通常被称作 子类…...

FastAPI(七)应用配置
目录 一、在apps下新建文件夹config 二、新建配置文件app_conf.py 一、在apps下新建文件夹config 二、新建配置文件app_conf.py from functools import lru_cachefrom pydantic.v1 import BaseSettingsclass AppConfig(BaseSettings):app_name: str "Windows10 插件&qu…...

eclipse Java Code_Style Code_Templates
Preferences - Java - Code Style - Code Templates Eclipse [Java_Code_Style_Code_Templates_ZengWenFeng] 2023.08.07.xml 创建一个新的工程,不然有时候不生效,旧项目可能要重新导入eclipse 创建一个测试类试一试 所有的设置都生效了...

01《Detecting Software Attacks on Embedded IoT Devices》随笔
2023.08.05 今天读的是一篇博士论文 论文传送门:Detecting Software Attacks on Embedded IoT Devices 看了很长时间,发现有一百多页,没看完,没看到怎么实现的。 摘要 联网设备的增加使得嵌入式设备成为各种网络攻击的诱人目标&…...

APP外包开发的学习流程
学习iOS App的开发是一项有趣和富有挑战性的任务,是一个不断学习和不断进步的过程。掌握基础知识后,不断实践和尝试新的项目将使您的技能不断提升。下面和大家分享一些建议,可以帮助您开始学习iOS App的开发。北京木奇移动技术有限公司&#…...

第0章 环境搭建汇总
mini商城第0章 环境搭建汇总 本文是整个mini商城的前置文档,所有用到的技术安装都在本篇文档中有详细描述。所有软件安装不分先后顺序,只是作为一个参考文档,需要用到什么技术软件,就按照文档安装什么软件,切不可一上来全部安装一遍。 文章中有些截图中服务器地址是192.16…...

大数据培训课程-《机器学习从入门到精通》上新啦
《机器学习从入门到精通》课程是一门专业课程,面向人工智能技术服务,课程系统地介绍了Python编程库、分类、回归、无监督学习和模型使用技巧以及算法和案例充分融合。 《机器学习从入门到精通》课程亮点: 课程以任务为导向,逐步学…...
暗黑版GPT流窜暗网 降低犯罪门槛
随着AIGC应用的普及,不法分子利用AI技术犯罪的手段越来越高明,欺骗、敲诈、勒索也开始与人工智能沾边。 近期,专为网络犯罪设计的“暗黑版GPT”持续浮出水面,它们不仅没有任何道德界限,更没有使用门槛,没有…...

数电与Verilog基础知识之同步和异步、同步复位与异步复位
同步和异步是两种不同的处理方式,它们的区别主要在于是否需要等待结果。同步是指一个任务在执行过程中,必须等待上一个任务完成后才能继续执行下一个任务;异步是指一个任务在执行过程中,不需要等待上一个任务完成,可以…...

JAVA Android 正则表达式
正则表达式 正则表达式是对字符串执行模式匹配的技术。 正则表达式匹配流程 private void RegTheory() {// 正则表达式String content "1998年12月8日,第二代Java平台的企业版J2EE发布。1999年6月,Sun公司发布了第二代Java平台(简称为Java2) &qu…...

【MFC】07.MFC第三大机制:消息映射-笔记
本专栏上两篇文章分别介绍了【MFC】05.MFC第一大机制:程序启动机制和【MFC】06.MFC第二大机制:窗口创建机制,这篇文章来为大家介绍MFC的第三大机制:消息映射 typfd要实现消息映射,必须满足的三个条件: 类必…...

【jvm】jvm的生命周期
目录 一、启动二、执行三、退出 一、启动 1.java虚拟机的启动是通过引导类加载器bootstrap class loader创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的(根据具体虚拟机的类型) 二、执行 1.一个运行中的java虚拟机…...

激光雷达测距和摄像头联合棋盘格反射率标定板
目前,激光雷达不仅在军事上起到了重要的作用,而且发挥其测程大、精度高、反应速度快、可靠性高等优点,在商业领域应用越来越广,发展越来越迅速,具有较高的实用价值和商业价值。车载三维成像激光雷达采用脉冲式测量原理…...

【Docker】docker镜像+nginx部署vue项目:
文章目录 一、文档:二、打包vue项目:三、配置nginx:四、配置Dockerfile:五、构建镜像:六、运行容器:七、最终效果: 一、文档: 【1】菜鸟教程:https://www.runoob.com/do…...

文件编辑(vi/vim)
在所有的命令执行前,先按Esc 1、vi的基本概念 基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式…...

1007 Maximum Subsequence Sum (PAT甲级)
惭愧,知道该用DP做,但是又翻了参考书才想起来。dp[i]表示以i项为结尾的最大子列。 #include <cstdio> #include <vector>int K, maxx, u, pu, pv; std::vector<int> vec, dp;int main(){scanf("%d", &K);vec.resize(K)…...

虚拟机centos7配置网络
虚拟机centos7配置网络 centos7克隆之后需要配置网络才能联网。 实验环境: VMware Workstation Pro 16CentOS 7系统虚拟机主机Windows 11系统 1.VMware网络模式设置为NAT模式 虚拟机–设置–网络适配器– 2.查看虚拟机 子网IP和网关IP 编辑–虚拟网…...

ChatGPT实战:创业咨询,少走弯路,少踩坑
用九死一生形容创业再适合不过,不过一旦成功回报也很诱人,这也是为什么那么多人下场创业。纸上得来终觉浅,绝知此事要躬行,创过业的人都知道其中的心酸,而他们也建议你去创业,因为那真不是一般人能干的事。…...

LangChain手记 Overview
整理并翻译自DeepLearning.AILangChain的官方课程:Overview 综述(Overview) LangChain是为大模型应用开发设计的开源框架 LangChain目前提供Python和JavaScript(TypeScript)两种语言的包 LangChain的主攻方向是聚合和…...

Vue_02:详细语法以及代码示例 + 知识点练习 + 综合案例(第二期)
2023年8月4日15:25:01 Vue_02_note 在Vue中,非相应式数据,直接往实例上面挂载就可以了。 01_Vue 指令修饰符 什么是指令修饰符呢? 答: 通过 " . " 指明一些指令后缀,不同 后缀 封装了不同的处理操作 —…...