欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > C++中的单例模式

C++中的单例模式

2025/2/24 1:05:11 来源:https://blog.csdn.net/GOLOJO/article/details/139590219  浏览:    关键词:C++中的单例模式

目录

单例模式(Singleton Pattern)

实际应用

配置管理器(Configuration Manager)

日志管理器(Logger)

数据库连接池(Database Connection Pool)

总结


单例模式(Singleton Pattern)

单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。单例模式常用于需要控制资源的共享访问,诸如数据库连接、日志管理器、配置管理等。

实际应用

配置管理器(Configuration Manager)

配置管理器在应用启动时加载配置,并在整个应用程序生命周期内提供访问。

#include <iostream>
#include <string>
#include <unordered_map>
#include <mutex>class ConfigManager {
public:static ConfigManager& getInstance() {static ConfigManager instance;return instance;}void loadConfig(const std::string& configFile) {// 模拟加载配置文件configData["db_host"] = "localhost";configData["db_user"] = "admin";configData["db_password"] = "password";}std::string getConfigValue(const std::string& key) {return configData[key];}private:ConfigManager() {}  // 私有构造函数ConfigManager(const ConfigManager&) = delete;ConfigManager& operator=(const ConfigManager&) = delete;std::unordered_map<std::string, std::string> configData;
};int main() {ConfigManager& config = ConfigManager::getInstance();config.loadConfig("config.txt");std::cout << "Database Host: " << config.getConfigValue("db_host") << std::endl;std::cout << "Database User: " << config.getConfigValue("db_user") << std::endl;return 0;
}

日志管理器(Logger)

日志管理器记录应用程序的日志信息,单例模式确保日志记录器在整个应用中是唯一的。

#include <iostream>
#include <fstream>
#include <mutex>class Logger {
public:static Logger& getInstance() {static Logger instance;return instance;}void log(const std::string& message) {std::lock_guard<std::mutex> lock(mutex_);logFile << message << std::endl;}private:Logger() {logFile.open("app.log", std::ios::app);}~Logger() {if (logFile.is_open()) {logFile.close();}}Logger(const Logger&) = delete;Logger& operator=(const Logger&) = delete;std::ofstream logFile;std::mutex mutex_;
};int main() {Logger& logger = Logger::getInstance();logger.log("Application started");logger.log("An error occurred");return 0;
}

数据库连接池(Database Connection Pool)

数据库连接池管理数据库连接的创建和复用,单例模式确保连接池在应用中只有一个实例。

#include <iostream>
#include <vector>
#include <mutex>
#include <memory>class DatabaseConnection {
public:void connect(const std::string& connectionString) {std::cout << "Connecting to database: " << connectionString << std::endl;// 模拟连接操作}void disconnect() {std::cout << "Disconnecting from database" << std::endl;// 模拟断开操作}
};class ConnectionPool {
public:static ConnectionPool& getInstance() {static ConnectionPool instance;return instance;}std::shared_ptr<DatabaseConnection> getConnection() {std::lock_guard<std::mutex> lock(mutex_);if (connections.empty()) {auto conn = std::make_shared<DatabaseConnection>();conn->connect(connectionString);return conn;} else {auto conn = connections.back();connections.pop_back();return conn;}}void releaseConnection(std::shared_ptr<DatabaseConnection> conn) {std::lock_guard<std::mutex> lock(mutex_);connections.push_back(conn);}private:ConnectionPool() : connectionString("DB_CONNECTION_STRING") {}ConnectionPool(const ConnectionPool&) = delete;ConnectionPool& operator=(const ConnectionPool&) = delete;std::string connectionString;std::vector<std::shared_ptr<DatabaseConnection>> connections;std::mutex mutex_;
};int main() {ConnectionPool& pool = ConnectionPool::getInstance();auto conn1 = pool.getConnection();auto conn2 = pool.getConnection();// 使用连接conn1->disconnect();pool.releaseConnection(conn1);return 0;
}

总结

我们在实际开发时会经常遇到此类设计模式 -- 单例模式,通过确保类的唯一实例来简化资源管理,并在多个场景中广泛应用,如配置管理、日志记录和数据库连接池。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词