单例模式【C++设计模式】-单例场景

时间:2025-02-21 13:43:50

在 RPC(Remote Procedure Call,远程过程调用)项目中,单例模式是一种常见的设计模式,用于确保某个类只有一个实例,并提供一个全局访问点。单例模式在 RPC 项目中特别有用,例如用于管理配置、日志记录器或连接池等资源。

例如:在 RPC 项目中使用单例模式来管理一个全局的配置对象

#include <iostream>
#include <mutex>
#include <memory>

class ConfigManager {
private:
    // 静态指针,存储唯一的实例
    static std::unique_ptr<ConfigManager> instance;

    // 私有化构造函数,防止外部直接构造
    ConfigManager() {
        std::cout << "ConfigManager initialized." << std::endl;
    }

    // 禁止拷贝构造和赋值操作
    ConfigManager(const ConfigManager&) = delete;
    ConfigManager& operator=(const ConfigManager&) = delete;

public:
    // 提供一个静态方法获取实例
    static ConfigManager& getInstance() {
        static std::once_flag onceFlag;
        std::call_once(onceFlag, []() {
            instance = std::make_unique<ConfigManager>();
        });
        return *instance;
    }

    // 示例方法:获取配置值
    std::string getConfigValue(const std::string& key) {
        // 这里可以实现从配置文件或数据库中读取配置
        return "value_for_" + key;
    }
};

// 初始化静态成员变量
std::unique_ptr<ConfigManager> ConfigManager::instance = nullptr;

使用单例

#include <iostream>

int main() {
    // 获取单例实例
    ConfigManager& configManager = ConfigManager::getInstance();

    // 使用单例实例
    std::string value = configManager.getConfigValue("database_url");
    std::cout << "Config Value: " << value << std::endl;

    return 0;
}

代码理解:

  1. 私有化构造函数
    • ConfigManager():构造函数被私有化,防止外部直接构造对象。
    • 禁止拷贝构造和赋值操作,确保类的实例唯一性。
  2. 静态实例
    • static std::unique_ptr<ConfigManager> instance;:静态成员变量,存储唯一的实例。
    • 使用 std::unique_ptr 确保实例在程序结束时自动释放。
  3. 全局访问点
    • static ConfigManager& getInstance():提供一个静态方法,用于获取唯一的实例。
    • 使用 std::call_oncestd::once_flag 确保实例只被初始化一次,即使在多线程环境下也能安全工作。
  4. 延迟初始化
    • 实例仅在第一次调用 getInstance() 时初始化,避免不必要的资源占用。