单例模式的模板

参考了网上的一些单例模式,自己也写一个模板。
要点:

  1. 线程安全性
  2. 单例对象的唯一性
#include <mutex>
//在模板类 Singleton 中,可以定义单例模式的实现细节
template <typename T>
class Singleton {
public://通过删除拷贝构造函数、赋值运算符、移动构造函数、移动赋值运算符等函数,确保了单例对象的唯一性Singleton(const Singleton &) = delete;				//删除 拷贝构造函数 Singleton& operator=(const Singleton &) = delete;	//删除 赋值运算符 Singleton(Singleton &&) = delete;					//删除 移动构造函数Singleton& operator=(Singleton &&) = delete;		//删除 移动赋值运算符//通过静态函数 instance() 返回单例对象的指针,并利用静态成员变量和静态成员函数确保单例对象的唯一性和线程安全性static T* instance(){static T object;return &object;}protected:Singleton() = default;virtual ~Singleton() = default;
};

以下为使用例子

//利用了 C++ 中的模板元编程技术,将单例模式的实现逻辑延迟到了模板类中,使得 MyClass 类只需专注于自身的业务逻辑而不必关心单例模式的细节
class MyClass: public Singleton<MyClass>
{
private://通过友元关系确保 Singleton 类能够访问 MyClass 的私有构造函数,从而限制了对 MyClass 对象的实例化friend class Singleton<MyClass>;MyClass() = default;~MyClass() = default;public:// ... 其他成员函数和数据成员
};int main() {MyClass* obj1 = Singleton<MyClass>::instance();MyClass* obj2 = Singleton<MyClass>::instance();// obj1 和 obj2 指向同一个 MyClass 对象return 0;
}

这种实现方式提供了一种简洁而且易于使用的单例模式实现方式

  1. 将单例模式的实现细节与具体的业务逻辑分离,增强了代码的可读性和可维护性
  2. 每次调用 Singleton::instance() 都会获取到同一个 MyClass 类的单例对象指针
  3. 使用了静态局部变量的初始化来保证多线程环境下的线程安全性,在C++11之后,静态局部变量的初始化是线程安全的。编译器会负责确保静态局部变量只被初始化一次,并且在多线程环境下保证线程安全
  4. 通过删除拷贝构造函数、赋值运算符、移动构造函数、移动赋值运算符等函数,确保了单例对象的唯一性

参考文章:
设计模式之单例模式(C++实现)
C++单例模式模板 (简单易懂且有效)
C++11中静态局部变量初始化的线程安全性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/609631.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

命令行重置kafka消费最新数据 —— 筑梦之路

kafka消费能力不足&#xff0c;消息积压太多&#xff0c;现需要重置消费&#xff0c;使其消费最新的数据 kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group test_topic_group1 --reset-offsets --topic test_topic --to-latest --execute Kafka 数据积压…

图解Kubernetes的服务(Service)

pod 准备&#xff1a; 不要直接使用和管理Pods&#xff1a; 当使用ReplicaSet水平扩展scale时&#xff0c;Pods可能被terminated当使用Deployment时&#xff0c;去更新Docker Image Version&#xff0c;旧Pods会被terminated&#xff0c;然后创建新Pods 0 啥是服务&#xf…

[工具探索]-PS处理图片文字

以下涉及到用PS进行图片中文字的删减、替换、修改等操作&#xff0c;比较琐碎&#xff0c;不过用替换方式可以做到无印记 1、将图片中中局部删除 &#xff08;1&#xff09;导入图片信息&#xff08;2&#xff09;首先双击图层解锁&#xff0c;然后按住alt键拖动图层&#xf…

服务器SSH连接问题:每次连接都需要多次尝试或需长时间等待

服务器系统&#xff1a;Ubuntu 22.04 相关服务&#xff1a; open-ssh 问题 最近服务器进行ssh连接往往需要多次尝试连接才能够成功&#xff0c;失败的连接报错如下&#xff1a; C:\Users\xx> ssh ab[IP] kex_exchange_identification: Connection closed by remote host C…

Open CASCADE学习|创建拓朴

目录 1、创建点gp_Pnt 2、创建向量gp_Vec 3、创建边TopoDS_Edge 4、线网络TopoDS_Wire 5、面TopoDS_Face 6、体TopoDS_Shape OpenCascade中的拓朴实体如下图所示&#xff0c;其中Compound可以包含很多Solid&#xff1b;Solid由Shell包围而成&#xff1b;Shell由相连的Fac…

LeetCode 36 有效的数独

题目描述 有效的数独 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考…

MySQL连续案例续集

01&#xff09;查询学过「张三」老师授课的同学的信息 SELECT s.*, c.cname, t.tname, sc.score FROM t_mysql_teacher t, t_mysql_course c, t_mysql_student s, t_mysql_score sc WHERE t.tid c.tid AND c.cid sc.cid AND sc.sid s.sid AND t.tname ‘张三’ 02&#x…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -创建图文投票实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

【leetcode:2397. 被列覆盖的最多行数】子集枚举、二进制枚举以及Gosper’s hack

题目描述 2397. 被列覆盖的最多行数 给你一个下标从 0 开始、大小为 m x n 的二进制矩阵 matrix &#xff1b;另给你一个整数 numSelect&#xff0c;表示你必须从 matrix 中选择的 不同 列的数量。 如果一行中所有的 1 都被你选中的列所覆盖&#xff0c;则认为这一行被 覆盖 了…

【SQL】对表中的记录通过时间维度分组,统计出每组的记录条数

场景&#xff1a;一般用作数据统计&#xff0c;比如统计一个淘宝用户在年、月、日的维度上的订单数。 业务&#xff1a;一个集合&#xff0c;以时间维度来进行分组求和。 准备一张订单表order&#xff0c;有一些常规属性&#xff0c;比如创建时间&#xff0c;订单号。 DDL语句如…

【2023】java常用HTTP客户端对比以及使用(HttpClient/OkHttp/WebClient)

&#x1f4bb;目录 1、介绍2、使用2.1、添加配置2.1.1、依赖2.1.2、工具类2.1.3、实体2.1.4、Controller接口 2.2、Apache HttpClient使用2.3 、OkHttp使用2.4、WebClient使用 1、介绍 现在java使用的http客户端主要包括以下几种 而这些中使用得最频繁的主要是&#xff1a; A…

Deno 1.22 发布

目录 更新默认的类型检查模式 移除Deno.emit()Deno.formatDiagnostics()和Deno.applySourceMap() API 默认启用Deno命名空间 --no-config标识 Navigator.userAgent 更新 Deno.resolveDns() API 引入新的Response.json()静态方法 在 LSP 默认启用 Linting 对测试运行程…

资源调度(2)-----pod的亲和性和反亲和性

集群调度: schedule的调度算法。 预算策略&#xff1a;过滤出合适的节点 优先策略&#xff1a; 选择部署的节点 nodeName:硬匹配&#xff0c;不走调度策略。node01. nodeSelector&#xff1a;根据节点的标签选择&#xff0c;会走调度算法。 只要是走调度算法&#xff0c;在不满…

[VSCode] VSCode 常用快捷键

文章目录 VSCode 源代码编辑器VSCode 常用快捷键分类汇总01 编辑02 导航03 调试04 其他05 重构06 测试07 扩展08 选择09 搜索10 书签11 多光标12 代码片段13 其他 VSCode 源代码编辑器 官网&#xff1a;https://code.visualstudio.com/ 下载地址&#xff1a;https://code.visua…

【排序算法】二、希尔排序(C/C++)

「前言」文章内容是排序算法之希尔排序的讲解。&#xff08;所有文章已经分类好&#xff0c;放心食用&#xff09; 「归属专栏」排序算法 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 希尔排序1.1 原理1.2 代码实现&#xff08;C/C&#xff09;1.3 特性总结 希尔排序 1.1…

数据结构-测试1

一、判断题 1.队列中允许插入的一端叫队头&#xff0c;允许删除的一端叫队尾&#xff08;F&#xff09; 队列中允许删除的一端叫队头&#xff08;front&#xff09;,允许插入的一端叫队尾&#xff08;rear&#xff09; 2. 完全二叉树中&#xff0c;若一个结点没有左孩子&#…

Developer Tools for Game Creator 1

插件包含: 持久世界时间管理系统 单击以生成对象或预设 游戏内调试控制台 游戏内事件控制台 控制台管理控制 命令模板脚本 游戏内屏幕截图 低分辨率和高分辨率图像 缩略图生成 移动支持 使用Game Creator Action或拖放来激活和控制组件,无需编码。 通过此资产,您可以获得: …

初识 Elasticsearch 应用知识,一文读懂 Elasticsearch 知识文集(1)

文章目录 &#x1f3c6; 初识 Elasticsearch 应用知识&#x1f50e; 初识 Elasticsearch 应用知识(1)&#x1f341;&#x1f341; 01、什么是 Elasticsearch&#xff1f;&#x1f341;&#x1f341; 02、能列出 10 个使用 Elasticsearch 作为其搜索引擎或数据库的公司吗&#x…

2023 年度合辑 | 出海大年的全球化产品洞察和服务动向

2023 年度合辑 年度关键词 出海&全球化 出海 & 全球化通信服务全面升维 出海大年&#xff0c;融云全球互联网通信云作为“全球化最佳基础设施”之一&#xff0c;发挥技术沉淀和实践积累带来的核心优势&#xff0c;结合市场变化对出海 & 全球化通信服务进行了全方位…

李沐之神经网络基础

目录 1.模型构造 1.1层和块 1.2自定义块 1.3顺序块 1.4在前向传播函数中执行代码 2.参数管理 2.1参数访问 2.2参数初始化 3.自定义层 3.1不带参数的层 3.2带参数的层 4.读写文件 4.1加载和保存张量 4.2加载和保存模型参数 1.模型构造 1.1层和块 import torch fr…