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