当前位置:   article > 正文

C++中的单例模式

C++中的单例模式

目录

单例模式(Singleton Pattern)

实际应用

配置管理器(Configuration Manager)

日志管理器(Logger)

数据库连接池(Database Connection Pool)

总结


单例模式(Singleton Pattern)

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

实际应用

配置管理器(Configuration Manager)

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

  1. #include <iostream>
  2. #include <string>
  3. #include <unordered_map>
  4. #include <mutex>
  5. class ConfigManager {
  6. public:
  7. static ConfigManager& getInstance() {
  8. static ConfigManager instance;
  9. return instance;
  10. }
  11. void loadConfig(const std::string& configFile) {
  12. // 模拟加载配置文件
  13. configData["db_host"] = "localhost";
  14. configData["db_user"] = "admin";
  15. configData["db_password"] = "password";
  16. }
  17. std::string getConfigValue(const std::string& key) {
  18. return configData[key];
  19. }
  20. private:
  21. ConfigManager() {} // 私有构造函数
  22. ConfigManager(const ConfigManager&) = delete;
  23. ConfigManager& operator=(const ConfigManager&) = delete;
  24. std::unordered_map<std::string, std::string> configData;
  25. };
  26. int main() {
  27. ConfigManager& config = ConfigManager::getInstance();
  28. config.loadConfig("config.txt");
  29. std::cout << "Database Host: " << config.getConfigValue("db_host") << std::endl;
  30. std::cout << "Database User: " << config.getConfigValue("db_user") << std::endl;
  31. return 0;
  32. }

日志管理器(Logger)

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

  1. #include <iostream>
  2. #include <fstream>
  3. #include <mutex>
  4. class Logger {
  5. public:
  6. static Logger& getInstance() {
  7. static Logger instance;
  8. return instance;
  9. }
  10. void log(const std::string& message) {
  11. std::lock_guard<std::mutex> lock(mutex_);
  12. logFile << message << std::endl;
  13. }
  14. private:
  15. Logger() {
  16. logFile.open("app.log", std::ios::app);
  17. }
  18. ~Logger() {
  19. if (logFile.is_open()) {
  20. logFile.close();
  21. }
  22. }
  23. Logger(const Logger&) = delete;
  24. Logger& operator=(const Logger&) = delete;
  25. std::ofstream logFile;
  26. std::mutex mutex_;
  27. };
  28. int main() {
  29. Logger& logger = Logger::getInstance();
  30. logger.log("Application started");
  31. logger.log("An error occurred");
  32. return 0;
  33. }

数据库连接池(Database Connection Pool)

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

  1. #include <iostream>
  2. #include <vector>
  3. #include <mutex>
  4. #include <memory>
  5. class DatabaseConnection {
  6. public:
  7. void connect(const std::string& connectionString) {
  8. std::cout << "Connecting to database: " << connectionString << std::endl;
  9. // 模拟连接操作
  10. }
  11. void disconnect() {
  12. std::cout << "Disconnecting from database" << std::endl;
  13. // 模拟断开操作
  14. }
  15. };
  16. class ConnectionPool {
  17. public:
  18. static ConnectionPool& getInstance() {
  19. static ConnectionPool instance;
  20. return instance;
  21. }
  22. std::shared_ptr<DatabaseConnection> getConnection() {
  23. std::lock_guard<std::mutex> lock(mutex_);
  24. if (connections.empty()) {
  25. auto conn = std::make_shared<DatabaseConnection>();
  26. conn->connect(connectionString);
  27. return conn;
  28. } else {
  29. auto conn = connections.back();
  30. connections.pop_back();
  31. return conn;
  32. }
  33. }
  34. void releaseConnection(std::shared_ptr<DatabaseConnection> conn) {
  35. std::lock_guard<std::mutex> lock(mutex_);
  36. connections.push_back(conn);
  37. }
  38. private:
  39. ConnectionPool() : connectionString("DB_CONNECTION_STRING") {}
  40. ConnectionPool(const ConnectionPool&) = delete;
  41. ConnectionPool& operator=(const ConnectionPool&) = delete;
  42. std::string connectionString;
  43. std::vector<std::shared_ptr<DatabaseConnection>> connections;
  44. std::mutex mutex_;
  45. };
  46. int main() {
  47. ConnectionPool& pool = ConnectionPool::getInstance();
  48. auto conn1 = pool.getConnection();
  49. auto conn2 = pool.getConnection();
  50. // 使用连接
  51. conn1->disconnect();
  52. pool.releaseConnection(conn1);
  53. return 0;
  54. }

总结

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/721222
推荐阅读
相关标签
  

闽ICP备14008679号