设计模式-单列模式

一、什么是单例模式?

单例模式(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");
}
相关推荐
七月丶10 小时前
别再手动凑 PR 了:这个 AI Skill 会按仓库习惯自动建分支、拆提交、提 PR
人工智能·设计模式·程序员
刀法如飞10 小时前
从程序员到架构师:6大编程范式全解析与实践对比
设计模式·系统架构·编程范式
九狼11 小时前
Flutter + Riverpod +MVI 架构下的现代状态管理
设计模式
静水流深_沧海一粟1 天前
04 | 别再写几十个参数的构造函数了——建造者模式
设计模式
StarkCoder1 天前
从UIKit到SwiftUI的迁移感悟:数据驱动的革命
设计模式
阿星AI工作室1 天前
给openclaw龙虾造了间像素办公室!实时看它写代码、摸鱼、修bug、写日报,太可爱了吧!
前端·人工智能·设计模式
_哆啦A梦2 天前
Vibe Coding 全栈专业名词清单|设计模式·基础篇(创建型+结构型核心名词)
前端·设计模式·vibecoding
阿闽ooo5 天前
中介者模式打造多人聊天室系统
c++·设计模式·中介者模式
小米4965 天前
js设计模式 --- 工厂模式
设计模式
逆境不可逃6 天前
【从零入门23种设计模式08】结构型之组合模式(含电商业务场景)
线性代数·算法·设计模式·职场和发展·矩阵·组合模式