设计模式-单列模式

一、什么是单例模式?

单例模式(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");
}
相关推荐
老蒋每日coding4 小时前
多智能体系统工作流的设计模式与实现策略
设计模式
进击的小头6 小时前
设计模式组合应用:智能硬件控制系统
c语言·设计模式
小码过河.7 小时前
设计模式——迭代器模式
设计模式·迭代器模式
琹箐19 小时前
设计模式——观察者模式
观察者模式·设计模式
小码过河.1 天前
设计模式——责任链模式
设计模式·责任链模式
sg_knight1 天前
抽象工厂模式(Abstract Factory)
java·python·设计模式·抽象工厂模式·开发
短剑重铸之日1 天前
《设计模式》第二篇:单例模式
java·单例模式·设计模式·懒汉式·恶汉式
J_liaty1 天前
23种设计模式一抽象工厂模式‌
设计模式·抽象工厂模式
短剑重铸之日1 天前
《设计模式》第一篇:初识
java·后端·设计模式
Cher ~1 天前
23种设计模式
开发语言·c++·设计模式