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

单例模式的模板

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

  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.lryc.cn/news/277405.html

相关文章:

  • C#基础-空处理
  • 测试平台开发vue组件化重构前端代码
  • 龍运当头--html做一个中国火龙祝大家龙年大吉
  • Dockerfile语法和简单镜像构建
  • uniapp使用wxml-to-canvas开发小程序保存canvas图片
  • 关于数据库切换的麻烦
  • Qt/QML编程学习之心得:Linux下读写文件File(24)
  • 【Vue2+3入门到实战】(22)VUE3之组合式API - setup、reactive和ref函数、computed、watch、生命周期函数详细讲解
  • 如何在互联网上找到你想要的数据?
  • 揭秘淘宝商品详情API如何助力电商创新发展
  • vue element plus Space 间距
  • 【驱动序列】C#获取电脑硬件之CPU信息,以及它都有那些品牌
  • 目标检测-One Stage-YOLO v3
  • 安泰ATA-4014高压功率放大器在传感器脉冲涡流检测中的应用
  • Axure全面指南:正确打开并高效使用的步骤!
  • ts axios 指定返回值类型,返回数据类型不确定该怎么办 typescript
  • 判断是否是json字符串
  • SpringBoot集成Minio(接上文)
  • 更新 torchtext 造成的torch版本不匹配的问题
  • flutter资源
  • C++经典程序
  • Java多线程-Thread类的run方法
  • java基础之Java8新特性-方法引入
  • K8S中的hostPort、NodePort 、targetPort、port、containerPort 的区别
  • SpringBoot整合FreeMarker模板引擎
  • 编程基础 - 变量与常量
  • Linux入门攻坚——12、Linux网络属性配置相关知识2
  • 如何自己实现一个分布式事务
  • 使用Nonebot编写QQ机器人
  • 认识SpringBoot中的条件注解