单例模式的模板

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

要点:

  1. 线程安全性
  2. 单例对象的唯一性
cpp 复制代码
#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;
};

以下为使用例子

cpp 复制代码
//利用了 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中静态局部变量初始化的线程安全性

相关推荐
sayang_shao13 分钟前
C++ ONNX Runtime 与 Python Ultralytics 库实现 YOLOv8 模型检测的区别
c++·python·yolo
LXS_35720 分钟前
STL - 函数对象
开发语言·c++·算法
专注于ai算法的踩坑小达人27 分钟前
C++变量全面总结
c++·qt
阿猿收手吧!35 分钟前
【C++】atmoic原子操作与并发安全全解析
开发语言·c++·安全
凯子坚持 c1 小时前
C++基于微服务脚手架的视频点播系统---客户端(1)
开发语言·c++·微服务
CSDN_RTKLIB1 小时前
SharedPtr测试步骤说明
c++
呱呱巨基1 小时前
Linux 第一个系统程序 进度条
linux·c++·笔记·学习
2401_838472511 小时前
C++中的装饰器模式实战
开发语言·c++·算法
爱学习的阿磊1 小时前
C++与Qt图形开发
开发语言·c++·算法
历程里程碑1 小时前
Linux 16 环境变量
linux·运维·服务器·开发语言·数据库·c++·笔记