创建型设计模式: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…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
