【学习笔记】单例类模板
一、单例类模板
以下为一个通用的单例模式框架,这种设计允许其他类通过继承Singleton模板类来轻松实现单例模式,而无需为每个类重复编写单例实现代码。
// 命名空间(Namespace) 和 模板(Template)
// 命名空间用于将代码组织成逻辑组,避免不同模块间的命名冲突
// 泛型实现:T 可以是任意类型(如 int、std::string、自定义类)。编译时实例化:编译器会为每个使用的具体类型生成对应的代码。
namespace core {
template <typename T>
class Singleton {
// 获取单例实例的静态方法
public:
static T& Instance() {
static T instance{Token{}};
return instance;
}
// 防止单例对象被复制或赋值,确保全局唯一性。
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton) = delete;
// Token 结构体:一个空的标记类型,用于让派生类能够调用基类的构造函数(因为构造函数是受保护的)。受保护的构造函数:防止外部直接实例化Singleton,但允许派生类继承。
protected:
struct Token {};
Singleton() = default;
~Singleton() = default;
};
继承单例类模板实例:
class IpSourceManage : public core::Singleton<IpSourceManage>
{
public:
IpSourceManage(Token){};
~IpSourceManage(){};
..........
};
二、单例类标志
静态获取方法(如 Instance())
单例类必须提供一个静态方法来获取唯一实例,通常命名为 Instance()。
static MyClass instance; // 静态实例(饿汉式)
static MyClass& Instance() {
static MyClass instance; // 懒汉式(C++11后线程安全)
return instance;
}
private 或 protected 构造函数
禁止外部直接实例化,只能通过 Instance() 方法创建对象。
class Nodes : public Node /*, public NodeMatch */ {
public:
private:
Nodes();
~Nodes();
..........
禁用拷贝和赋值
delete 关键字:显式删除拷贝构造函数和赋值运算符,防止对象被复制。
MyClass(const MyClass&) = delete; // 禁用拷贝构造
MyClass& operator=(const MyClass&) = delete; // 禁用赋值