当前位置: 首页 > news >正文

创建型设计模式: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、单例模式&#xff08;Singleton Pattern&#xff09;的含义 2、单例模式的优缺点 &#xff08;1&#xff09;优点&#xff1a; &#xff08;2&#xff09;缺点&#xff1a; 3、C实现单例模式的示例&#xff08;简单&#xff09; 4、C实现单例模式的示例&#xff…...

JavaWeb学习笔记

Maven:自动导入配置jar包。 Maven项目架构管理工具&#xff1a;核心思想&#xff1a;约定大于配置 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.为什么要建立时序约束&#xff1f;3.SignalTap Ⅱ4.SignalTap Ⅱ使用方法5.HDL的仿真软件&#xff08;modelsim&#xff09;6.阻抗匹配 1.建立时间和保持时间 答&#xff1a; 2.为什么要建立时序约束&#xff1f; 答&#xff1a; 3.Sign…...

FortiGate防火墙日志审计运维

环境介绍 CPU&#xff1a;8核&#xff0c;内存&#xff1a;16GB&#xff0c;硬盘&#xff1a;100GB 操作系统版本&#xff1a;CentOS-7-x86_64-DVD-2003 平台版本&#xff1a;鸿鹄2.7.0 安装组件 安装环境支持确认 鸿鹄计算引擎使用了 AVX2 高级指令集做向量计算加速&#xf…...

基于yolo v5与Deep Sort进行车辆以及速度检测与目标跟踪实战

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

以指标驱动,保险、零售、制造企业开启精益敏捷运营的新范式

近日&#xff0c;以“释放数智生产力”为主题的 Kyligence 用户大会在上海前滩香格里拉大酒店成功举行。大会包含上午的主论坛和下午的 4 场平行论坛&#xff0c;并举办了闭门会议、Open Day 等活动。来自金融、零售、制造、医药等行业的客户及合作伙伴带来了超过 23 场主题演讲…...

MyBatis-动态SQL-foreach

目录 标签有以下常用属性&#xff1a; 小结 <froeach> <foreach>标签有以下常用属性&#xff1a; collection&#xff1a;指定要迭代的集合或数组的参数名&#xff08;遍历的对象&#xff09;。item&#xff1a;指定在迭代过程中的每个元素的别名&#xff08;遍历…...

VUE框架:vue2转vue3全面细节总结(3)路由组件传参

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人_python人工智能视觉&#xff08;opencv&#xff09;从入门到实战,前端,微信小程序-CSDN博客 最新的uniapp毕业设计专栏也放在下方了&#xff1a; https://blog.csdn.net/lbcy…...

音视频技术开发周刊 | 305

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

vue 图片base64转化

import html2canvas from ‘html2canvas’ html2canvas(canvasDom, options).then(canvas > { //此时的图片是base64格式的&#xff0c;我们将图片格式转换一下 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)继承 子类是一个派生类&#xff0c;他派生自父类&#xff08;基类&#xff09;&#xff0c;通过 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 创建一个新的工程&#xff0c;不然有时候不生效&#xff0c;旧项目可能要重新导入eclipse 创建一个测试类试一试 所有的设置都生效了...

01《Detecting Software Attacks on Embedded IoT Devices》随笔

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

APP外包开发的学习流程

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

第0章 环境搭建汇总

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

大数据培训课程-《机器学习从入门到精通》上新啦

《机器学习从入门到精通》课程是一门专业课程&#xff0c;面向人工智能技术服务&#xff0c;课程系统地介绍了Python编程库、分类、回归、无监督学习和模型使用技巧以及算法和案例充分融合。 《机器学习从入门到精通》课程亮点&#xff1a; 课程以任务为导向&#xff0c;逐步学…...

暗黑版GPT流窜暗网 降低犯罪门槛

随着AIGC应用的普及&#xff0c;不法分子利用AI技术犯罪的手段越来越高明&#xff0c;欺骗、敲诈、勒索也开始与人工智能沾边。 近期&#xff0c;专为网络犯罪设计的“暗黑版GPT”持续浮出水面&#xff0c;它们不仅没有任何道德界限&#xff0c;更没有使用门槛&#xff0c;没有…...

数电与Verilog基础知识之同步和异步、同步复位与异步复位

同步和异步是两种不同的处理方式&#xff0c;它们的区别主要在于是否需要等待结果。同步是指一个任务在执行过程中&#xff0c;必须等待上一个任务完成后才能继续执行下一个任务&#xff1b;异步是指一个任务在执行过程中&#xff0c;不需要等待上一个任务完成&#xff0c;可以…...

JAVA Android 正则表达式

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

像素幻梦·创意工坊实操手册:实时HUD状态栏信息读取与调试技巧

像素幻梦创意工坊实操手册&#xff1a;实时HUD状态栏信息读取与调试技巧 1. 认识像素幻梦的HUD状态栏 像素幻梦创意工坊的HUD&#xff08;Head-Up Display&#xff09;状态栏位于界面顶部&#xff0c;采用16-bit像素风格设计&#xff0c;为创作者提供实时系统状态反馈。这个看…...

别再手动改配置了!用Docker Compose一键部署带Web管理界面的Pulsar独立集群

告别手动配置&#xff1a;Docker Compose全自动部署Pulsar集群与Web管理平台 每次搭建开发环境都要重复输入十几条Docker命令&#xff1f;配置文件散落在各个角落难以维护&#xff1f;今天我要分享的这套方案&#xff0c;将彻底改变你部署消息队列的方式。只需一个YAML文件&…...

WPF Chart控件实战:构建高性能实时数据监控曲线

1. WPF Chart控件基础入门 第一次接触WPF Chart控件时&#xff0c;我也被它强大的功能震撼到了。这个控件就像是一个神奇的画板&#xff0c;能够将枯燥的数据变成直观的曲线图。在工业监控系统中&#xff0c;我们经常需要实时显示温度、压力等参数的变化趋势&#xff0c;这时候…...

数据集成工具深度评测:SeaTunnel 与 DataX、Sqoop、Flume、Flink CDC 在实时场景下的性能较量

1. 实时数据集成工具选型的关键指标 在数据驱动的时代&#xff0c;企业每天需要处理海量实时数据流。选择合适的数据集成工具直接影响业务系统的响应速度和决策效率。我经历过多次数据同步工具选型的痛苦过程&#xff0c;总结出实时场景下最关键的5个评估维度&#xff1a; 首先…...

雯雯的后宫-造相Z-Image-瑜伽女孩实战教程:结合ControlNet实现精准体式控制

雯雯的后宫-造相Z-Image-瑜伽女孩实战教程&#xff1a;结合ControlNet实现精准体式控制 1. 从零开始&#xff1a;环境准备与模型部署 想要生成专业的瑜伽女孩图片&#xff0c;首先需要搭建好环境。雯雯的后宫-造相Z-Image-瑜伽女孩是一个专门针对瑜伽场景优化的文生图模型&am…...

告别Windows AI困扰:RemoveWindowsAI工具全方位解决方案

告别Windows AI困扰&#xff1a;RemoveWindowsAI工具全方位解决方案 【免费下载链接】RemoveWindowsAI Force Remove Copilot and Recall in Windows 项目地址: https://gitcode.com/GitHub_Trending/re/RemoveWindowsAI 在数字时代的隐私保卫战中&#xff0c;Windows系…...

Qwen3字幕生成工具实战:快速处理会议录音,输出带时间戳字幕

Qwen3字幕生成工具实战&#xff1a;快速处理会议录音&#xff0c;输出带时间戳字幕 1. 会议录音转字幕的痛点与解决方案 处理会议录音是许多职场人士的日常任务。传统方法需要先听录音&#xff0c;再手动记录内容&#xff0c;最后还要逐句对齐时间轴&#xff0c;整个过程耗时…...

gemma-3-12b-it镜像开箱即用:3分钟完成多模态服务启动与测试

gemma-3-12b-it镜像开箱即用&#xff1a;3分钟完成多模态服务启动与测试 1. 快速了解Gemma-3-12b-it 如果你正在寻找一个既能理解文字又能看懂图片的AI模型&#xff0c;而且希望它能在普通电脑上运行&#xff0c;那么Gemma-3-12b-it就是为你准备的。 Gemma是Google推出的轻量…...

如何高效捕获网页媒体资源?猫抓插件让智能嗅探变得如此简单

如何高效捕获网页媒体资源&#xff1f;猫抓插件让智能嗅探变得如此简单 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否遇到过想保存网页上的精彩视频却找不到下载按钮的尴尬&#xff1f;是否曾…...

告别Zabbix!轻量级监控神器Netdata在Ubuntu 22.04上的花式玩法

告别Zabbix&#xff01;轻量级监控神器Netdata在Ubuntu 22.04上的花式玩法 1. 为什么Netdata正在重新定义监控体验 凌晨三点&#xff0c;服务器告警短信惊醒睡梦中的你。手忙脚乱连上VPN&#xff0c;却发现只是Zabbix又一个误报——这样的场景是否似曾相识&#xff1f;传统监控…...