设计模式-单列模式

一、什么是单例模式?

单例模式(Singleton Pattern)保证:

  1. 类只有一个实例
  2. 并提供一个对该实例的全局访问方式

适用场景:

  • 需要全局唯一对象
  • 资源消耗大,不适合频繁创建
    如:日志系统、配置管理、数据库连接管理等

二、为什么要使用单例模式?

如果一个类在系统中被多次实例化,可能会带来问题:

使用单例模式,可以:

  • 保证唯一实例,节省资源
  • 全局访问方便
  • 控制初始化与生命周期
  • 避免多对象修改导致的状态不一致

若不使用单例:

  • 可能生成多个实例
  • 资源浪费
  • 状态难同步

三、现实生活类比 🏢

电梯调度系统:

整栋楼只有一个电梯调度中心

所有电梯请求都由它集中管理

类似"全局唯一对象"

它必须单例,否则多个调度中心会互相冲突。


四、代码示例

不使用单例模式

cpp 复制代码
#include <iostream>
using namespace std;

class Logger {
public:
    void log(const string& message) 
    {
        cout << "[Log] " << message << endl;
    }
};

int main()
 {
    Logger logger1;
    Logger logger2;

    logger1.log("Hello");
    logger2.log("World");
}

使用单例模式

cpp 复制代码
#include <iostream>
#include <mutex>
using namespace std;

class Logger {
private:
    Logger() {}                    // 构造函数私有
    Logger(const Logger&) = delete; // 禁止拷贝
    Logger& operator=(const Logger&) = delete;

    static Logger* instance;
    static mutex mtx;

public:
    static Logger* getInstance() {
        if (instance == nullptr) {
            lock_guard<mutex> lock(mtx);
            if (instance == nullptr) {
                instance = new Logger();
            }
        }
        return instance;
    }

    void log(const string& msg) {
        cout << "[Log] " << msg << endl;
    }
};

Logger* Logger::instance = nullptr;
mutex Logger::mtx;

int main() {
    Logger* logger = Logger::getInstance();
    logger->log("Singleton Hello");
}
相关推荐
Javatutouhouduan8 小时前
记一次redis主从切换导致的数据丢失与陷入只读状态故障
java·redis·设计模式·java面试·高可用·java后端·java程序员
数据知道10 小时前
Go语言设计模式:抽象工厂模式详解
设计模式·golang·抽象工厂模式·go语言
奔跑吧 android10 小时前
【Qt】【1. 版本特性介绍】
qt·cpp·qml
数据知道10 小时前
Go语言设计模式:组合模式详解
设计模式·golang·组合模式·go语言
有意义12 小时前
Spring Boot 项目中部门查询功能实现与依赖注入优化
后端·设计模式
岁忧15 小时前
Go channel 的核心概念、操作语义、设计模式和实践要点
网络·设计模式·golang
songgeb17 小时前
《设计模式之美》之适配器模式
设计模式
Yeniden17 小时前
【设计模式】享元模式(Flyweight)大白话讲解!
java·设计模式·享元模式
乙己40717 小时前
设计模式——单例模式(singleton)
java·c++·单例模式·设计模式