当前位置: 首页 > 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…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...

xmind转换为markdown

文章目录 解锁思维导图新姿势&#xff1a;将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件&#xff08;ZIP处理&#xff09;2.解析JSON数据结构3&#xff1a;递归转换树形结构4&#xff1a;Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...