单例模式的模板

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

要点:

  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中静态局部变量初始化的线程安全性

相关推荐
艾莉丝努力练剑8 小时前
【C++:C++11】C++11新特性深度解析:从可变参数模板到Lambda表达式
c++·stl·c++11·lambda·可变模版参数
同学小张10 小时前
【端侧AI 与 C++】1. llama.cpp源码编译与本地运行
开发语言·c++·aigc·llama·agi·ai-native
爱学习的小邓同学14 小时前
C++ --- 多态
开发语言·c++
招摇的一半月亮20 小时前
P2242 公路维修问题
数据结构·c++·算法
f***019321 小时前
CC++链接数据库(MySQL)超级详细指南
c语言·数据库·c++
合方圆~小文21 小时前
球型摄像机作为现代监控系统的核心设备
java·数据库·c++·人工智能
椰萝Yerosius1 天前
[题解]2024CCPC郑州站——Z-order Curve
c++·算法
滨HI01 天前
C++ opencv简化轮廓
开发语言·c++·opencv
学习路上_write1 天前
FREERTOS_互斥量_创建和使用
c语言·开发语言·c++·stm32·单片机·嵌入式硬件
闻缺陷则喜何志丹1 天前
【SOSDP模板 容斥原理 逆向思考】3757. 有效子序列的数量|分数未知
c++·算法·力扣·容斥原理·sosdp·逆向思考