(1)单例模式
单例模式是最常用的设计模式之一,属于创建型设计模式,它的核心目标是:确保一个类在整个程序生命周期中只有一个实例,并提供一个全局访问点。
核心意图
- 控制实例数量:防止一个类被多次实例化。
- 提供全局访问:让任何地方都能方便地访问这个唯一的实例。
- 节省资源:对于重量级对象(如数据库连接、配置管理器),避免重复创建
一个典型的单例类包含以下要素:
- 私有构造函数,防止外部通过 new 或直接构造来创建实例。
- 私有静态实例,类内部持有一个指向自身唯一实例的静态指针或对象。
- 公有静态访问方法,通常命名为 getInstance(),用于获取唯一实例。首次调用时创建实例,之后返回已有实例。
通用单例模板父类,子类继承即可。
#pragma once
#include <mutex>
/**
* @brief 单例模式模板基类
* @tparam T 子类类型
*
* 使用方式:
* 1. 子类继承 Singleton<T>
* 2. 子类构造函数设为 protected 或 private
* 3. 通过 SubClass::getInstance() 获取唯一实例
*/
template <typename T>
class Singleton {
public:
// 删除拷贝构造和赋值
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
/**
* @brief 获取单例实例(线程安全)
* @return T& 单例对象的引用
*/
static T& getInstance() {
// C++11 起,局部静态变量的初始化是线程安全的
static T instance;
return instance;
}
protected:
// 允许子类构造和析构
Singleton() = default;
virtual ~Singleton() = default;
};
用例:
class Logger : public Singleton<Logger> {
friend class Singleton<Logger>;
protected:
Logger() {
std::cout << "Logger 构造" << std::endl;
}
public:
void log(const std::string& message) {
std::cout << "[LOG] " << message << std::endl;
}
};
// 日志器单例
auto& logger = Logger::getInstance();
logger.log("Application started.");