• C++中的单例模式


    目录

    单例模式(Singleton Pattern)

    实际应用

    配置管理器(Configuration Manager)

    日志管理器(Logger)

    数据库连接池(Database Connection Pool)

    总结


    单例模式(Singleton Pattern)

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

    实际应用

    配置管理器(Configuration Manager)

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

    1. #include
    2. #include
    3. #include
    4. #include
    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 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
    2. #include
    3. #include
    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 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
    2. #include
    3. #include
    4. #include
    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 getConnection() {
    23. std::lock_guard lock(mutex_);
    24. if (connections.empty()) {
    25. auto conn = std::make_shared();
    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 conn) {
    35. std::lock_guard 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> 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. }

    总结

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

  • 相关阅读:
    04 MongoDB各种查询操作 以及聚合操作总结
    JavaScript实现斐波那契数列
    JS-ECharts-前端图表 多层级联合饼图、柱状堆叠图、柱/线组合图、趋势图、自定义中线、平均线、气泡备注点
    干货解读|数据挖掘最全整理
    银行家算法程序模拟实现
    微信小程序入门开发教程
    kotlin coroutine源码解析之Dispatchers协程调度器
    【Java精炼系列篇】【事务】【事务的使用】
    基于Linux的邮件模拟系统设计与实现
    Spring 源码解读(1) - Spring上下文构造方法的初始化
  • 原文地址:https://blog.csdn.net/GOLOJO/article/details/139590219