(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.");
posted @ 2018-06-25 15:03  osbreak  阅读(160)  评论(0)    收藏  举报