C++设计模式之:单例模式singleton

devtools/2024/9/18 9:57:50/ 标签: c++, 设计模式, 单例模式

摘要:

   it人员无论是使用哪种高级语言开发东东,想要更高效有层次的开发程序的话都躲不开三件套:数据结构,算法和设计模式设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案,使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。

   设计模式坚持七大原则:开闭原则,单一职责原则,里氏替换原则,依赖倒转原则,接口隔离原则,迪米特原则,合成复用原则,而各项设计模式又区分为三大模式,创建型模式,结构型模式,行为模式。

   此系列专注讲解C++开发过程中高需求好用的设计模式类型,能更好的简练项目架构和代码量,通过使用场景以及代码实现来更好的介绍。本文介绍的是单例模式singleton。

(开发环境:VSCode,GCC13.2.0,cmake3.8)

关键词C++设计模式单例模式Design patternsingleton

声明:本文作者原创,转载请附上文章出处与本文链接。

文章目录

      • 摘要:
      • 正文:
        • 介绍
        • 使用场景
        • 注意事项
        • 代码实现
      • 推荐阅读

正文:

介绍

   单例模式(Singleton Pattern)是一种常用的软件设计模式,这种类型的设计模式属于创建型模式,其目的确保一个类仅有一个实例,并提供一个访问它的全局访问点。这种模式在需要控制资源访问、实现配置文件的读取或者管理数据库连接等场景下非常有用。

使用场景

   正如一个项目一个系统内,只会有一个日志,一个数据中台,一个数据库一个IO一样,把这些模块设计成单例模式可避免对资源的多重占用,减少内存的开销,提高代码可读性和复用性。

   在C++中单例或许可以等式于全局变量+命名空间,如果不是为复杂抽象业务,也可以简单用全局变量实现。

   单例虽好但现实也有存在很多滥用单例的情况,比如只是以需要一个全局变量为由加了一个单例类,为避免这种情况最好就是特殊模块用单例(做成库),加创建一个命名空间内放置零散的全局变量,函数。

注意事项
  • 确保类只有一个实例,并提供一个全局访问点。
  • 在多线程环境下,确保单例的唯一性,也即是线程安全。
  • 要注意定义与声明分离,不然打包成库引用的话可能会有定义bug。
代码实现

单例模式可以分为懒汉式饿汉式,两者之间的区别在于创建实例的时间不同。

  • 懒汉式:延迟加载,即在第一次使用时才创建实例。
  • 饿汉式:类加载时就完成实例的初始化,确保线程安全但可能会浪费资源。

   比较多的是用lazy_load懒汉式然后加锁保证线程安全,懒汉式常用的两种方式加锁,一种互斥锁mutex,另一种使用call_once。使用互斥锁mutex来给单例加锁的方法是确保同一时刻只能有一个线程取得该锁,其他试图取得该锁的线程阻塞,待持有锁的线程释放独占锁时,才能唤醒取得独占锁后继续运行,而call_once则是在多线程环境中,确保某个对象只初始化一次,更推荐使用call_once

懒汉式(线程安全,使用互斥锁mutex)

#pragma once
#include <mutex>
#include <iostream>class Singleton 
{
public:// 防止拷贝Singleton() = default;Singleton(const Singleton&) = default;Singleton& operator=(const Singleton&) = default;static Singleton* GetInstance(){// 创建-使用数据库单例,双重锁定if (singleton == nullptr) {std::unique_lock<std::mutex> lock(mtx);if (singleton == nullptr) {singleton = new Singleton();singleton->_InitData();}}return singleton;}//释放资源static void Release(){if (singleton != NULL) {delete singleton;singleton = NULL;}}// 成员函数// ……private://初始化数据void _InitData();static Singleton* singleton;static std::mutex mtx;
};Singleton* Singleton::singleton = nullptr;
std::mutex Singleton::mtx;

懒汉式(线程安全,使用call_once)

#pragma once
#include <mutex>
#include <iostream>class Singleton
{
public:// 防止拷贝Singleton() = default;Singleton(const Singleton&) = default;Singleton& operator=(const Singleton&) = default;// 创建-使用数据库单例 lazy_loadstatic Singleton* GetInstance(){static std::once_flag s_flag;std::call_once(s_flag, [&](){singleton = new Singleton();singleton->_InitData();});return singleton;}// 释放资源static void Release(){if (singleton != NULL) {delete singleton;singleton = NULL;}}// 成员函数// ……private://初始化数据void _InitData();static Singleton* singleton;std::unordered_map<std::string, ISSUEDATA> data;	
};Singleton* Singleton::singleton = NULL;

over~

推荐阅读

博客主页:https://blog.csdn.net/weixin_45068267
(客官逛一逛,有许多其它有趣的专栏博文)

C/C++专栏:https://blog.csdn.net/weixin_45068267/category_12268204.html
(内含其它设计模式的介绍和实现)


http://www.ppmy.cn/devtools/107959.html

相关文章

目标检测-YOLOv7

YOLOv7 YOLOv7 是 YOLO 系列的最新进化版本&#xff0c;它在 YOLOv6 的基础上进行了进一步优化&#xff0c;目标是在保持高检测精度的同时&#xff0c;继续提升速度和计算效率。YOLOv7 在网络架构、损失函数和优化技术上进行了多项改进&#xff0c;使得它在计算复杂度和性能之…

云原生架构概念

云原生架构概念 云原生架构&#xff08;Cloud Native Architechtrue&#xff09;作为一种现代软件开发的革新力量&#xff0c;正在逐渐改变企业构建、部署和管理应用程序的方式。它的核心优势在于支持微服务架构&#xff0c;使得应用程序能够分解为独立、松耦合的服务&#xf…

Git如何安装和配置

一、Git 的安装 1、Git 的官网 Git (git-scm.com) 2、下载 Git for Windows 在官网下载好 Git 的安装文件后&#xff0c;接下来就可以进行安装了。 3、安装 Git 以管理员身份运行你下载的安装文件&#xff1a; 然后就可以进入安装向导了。 4、验证是否安装成功 当安装向…

【openwrt-21.02】T750 openwrt MT7916 使用Intel AX200的网卡WPS PBC连接失败问题分析及解决方案

Openwrt版本 NAME="OpenWrt" VERSION="21.02-SNAPSHOT" ID="openwrt" ID_LIKE="lede openwrt" PRETTY_NAME="OpenWrt 21.02-SNAPSHOT" VERSION_ID="21.02-snapshot" HOME_URL="https://openwrt.org/" …

android 媒体文件显示时间不对,date_added和date_modified分别代表什么含义。

图片文件对应数据库字段如下&#xff1a; 812 db.execSQL("CREATE TABLE files (_id INTEGER PRIMARY KEY AUTOINCREMENT," 813 "_data TEXT UNIQUE COLLATE NOCASE,_size INTEGER,format INTEGER,parent INTEGER," 814 …

TinyWebSever源码逐行注释()_简单代码的整合

前言 项目源码地址 项目详细介绍 项目简介&#xff1a; Linux下C轻量级Web服务器&#xff0c;助力初学者快速实践网络编程&#xff0c;搭建属于自己的服务器. 使用 线程池 非阻塞socket epoll(ET和LT均实现) 事件处理(Reactor和模拟Proactor均实现) 的并发模型使用状态机…

【C++】list底层的模拟实现

个人主页 文章目录 &#x1f384;一、前言&#x1f3e0;二、基本框架&#x1f3a1;三、list节点类的实现&#x1f389;四、list迭代器类1.Ref operator*()2.Ptr operator->()3.Self& operator()前置和Self& operator--()前置4.Self operator(int)后置和Self operato…

ffmpeg音视频开发从入门到精通——ffmpeg下载编译与安装

音视频领域学习 FFmpeg 的重要性 1. FFmpeg 的广泛应用 FFmpeg 是一个开源的音视频处理工具&#xff0c;具有强大的功能和灵活性&#xff0c;广泛应用于多个音视频领域&#xff0c;包括但不限于&#xff1a; 直播&#xff1a;FFmpeg 可以用于实时音视频流的编码、解码和转码&…

算法练习题14——leetcode84柱形图中最大的矩形(单调栈)

题目描述&#xff1a; 解题思路&#xff1a; 要解决这个问题&#xff0c;我们需要找到每个柱子可以扩展的最大左右边界&#xff0c;然后计算以每个柱子为高度的最大矩形面积。 具体步骤如下&#xff1a; 计算每个柱子左侧最近的比当前柱子矮的位置&#xff1a; 使用一个单调…

【全网最全】《2024高教社杯/国赛》 B题 思路+代码+文献 优化算法+决策树 第一问 生产过程中的决策问题

领取压缩包 问题 1 建模思路 问题描述 企业需要购买零配件1和零配件2&#xff0c;供应商声称一批零配件&#xff08;零配件1或零配件2&#xff09;的次品率不超过某个标称值&#xff08;例如10%&#xff09;。企业希望通过抽样检测来决定是否接收这批零配件&#xff0c;同时希…

vue3+ts封装类似于微信消息的组件

组件代码如下&#xff1a; <template><div:class"[voice-message, { sent: isSent, received: !isSent }]":style"{ backgroundColor: backgroundColor }"click"togglePlayback"><!-- isSent为false在左侧&#xff0c;为true在右…

某云彩SRM2.0任意文件下载漏洞

文章目录 免责申明搜索语法漏洞描述漏洞复现修复建议 免责申明 本文章仅供学习与交流&#xff0c;请勿用于非法用途&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任 搜索语法 fofa icon_hash"1665918155"漏洞描述 某云采 SRM2.0是一款先…

优质的产业园都在怎么做运营?

产业园区作为区域经济发展的重要载体&#xff0c;其运营模式和管理水平直接影响着产业集聚的成效和区域经济的竞争力。在一线城市与新一线城市中&#xff0c;已经涌现出了一批以高效运营、创新服务为特色的优质产业园&#xff0c;今天&#xff0c;我们就城市标杆产业园的案例和…

学习之git分支

git分支 2.1 什么是分支 2.2 分支的好处 2.3 分支的操作 2.3.1 git branch -v 查看分支 2.3.2 git branch 分支名 创建分支 2.3.3 git checkout 分支名 切换分支 2.3.4 git merge 分支名 把指定的分支合并到当前分支上

经验笔记:NoSQL数据库及其缓存方法实践

NoSQL数据库及其缓存方法实践经验笔记 随着大数据时代的到来&#xff0c;传统的关系型数据库在处理大规模数据时面临诸多挑战&#xff0c;如扩展性不足、性能瓶颈等问题。NoSQL数据库因其在可扩展性、灵活性和性能方面的优势&#xff0c;逐渐成为解决这些问题的有效方案之一。…

prometheus基于文件的服务发现

之间讲到&#xff0c;prometheus监控的对象就来自于他的配置文件里面的targets&#xff0c;如果要新增被监控对象&#xff0c;就继续往targets里面加。 但这个缺点是&#xff0c;每次修改完后都得重启prometheus。有没有什么办法&#xff0c;能在不重启的情况下增加target呢&a…

MongoDB-Change Stream

Change Stream 指数据的变化事件流&#xff0c;MongoDB从3.6版本开始提供订阅数据变更的功能 是用于实现变更追踪的解决方案 Change Stream 的实现原理&#xff1a;是基于 oplog 实现的&#xff0c;提供推送实时增量的推送功能 它在 oplog 上开启一个 tailable cursor 来追踪所…

国内外大模型汇总(包括科大星火、文心一言、通义千问、智普清言、华为大模型)

国内外大模型汇总 1. 科大讯飞星火认知大模型 主要特点&#xff1a; 多语言能力&#xff1a;以中文为核心&#xff0c;同时支持多语言处理&#xff0c;能够进行跨语种的语言理解和生成。 广泛的任务能力&#xff1a;具备内容生成、语言理解、知识问答、推理、数学计算、代码…

Docker 安装 MySQL 8.0 并支持远程访问

Docker 安装 MySQL 8.0 完成下面需求&#xff1a; 支持远程访问、数据与日志文件映射端口外部映射其他容器的网络访问 可以按照以下步骤进行配置&#xff0c;进行配置和完成了。 1. 准备工作 首先&#xff0c;确保 Docker 正常安装并运行&#xff0c;然后执行以下步骤。 2. …

第二届金牌导游大赛活动方案

1.风采展示&#xff1a; 每位选手进行1 分钟的个人展示(先观看1分钟视频&#xff0c;尔 后1分钟个人介绍),应从“职业感悟”“家乡美”“旅游人”“旅 途事”四个主题中选择一个主题&#xff0c;结合自我介绍、符合导游职业 特点的才艺进行创编&#xff0c;讲好导游自身、普通…