设计模式-单列模式

一、什么是单例模式?

单例模式(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");
}
相关推荐
口袋物联1 小时前
设计模式之建造者模式在 C 语言中的应用(含 Linux 内核实例)
c语言·设计模式·建造者模式
phdsky5 小时前
【设计模式】抽象工厂模式
c++·设计模式·抽象工厂模式
7***37456 小时前
Java设计模式之工厂
java·开发语言·设计模式
雨中飘荡的记忆6 小时前
设计模式之原型模式
设计模式
LengineerC7 小时前
Rust仿node事件总线的简单实现
设计模式·rust
IT永勇8 小时前
C++设计模式-装饰器模式
c++·设计模式·装饰器模式
口袋物联15 小时前
设计模式之工厂模式在 C 语言中的应用(含 Linux 内核实例)
linux·c语言·设计模式·简单工厂模式
phdsky17 小时前
【设计模式】建造者模式
c++·设计模式·建造者模式
小毛驴85017 小时前
软件设计模式-装饰器模式
python·设计模式·装饰器模式
phdsky19 小时前
【设计模式】代理模式
设计模式·代理模式