当前位置: 首页 > news >正文

设计模式 Day 1:单例模式(Singleton Pattern)详解

设计模式学习不在于一蹴而就,而在于持续积累与反复思考。本篇作为设计模式学习计划的第一天内容,旨在通过结构化讲解帮助读者牢牢掌握单例模式的核心思想与使用方法。后续每日将采用“回顾昨日知识 + 学习新模式”的方式推进,这样开篇,一方面帮助读者快速回忆 Day 1,另一方面也自然引出了 Day 2 的学习重点。
在这里插入图片描述


一、设计意图

在某些应用中,我们希望某个类在系统中只存在一个实例。例如:

  • 配置管理类
  • 日志系统
  • 数据库连接池
  • 线程池

这些对象往往资源占用大,或维护全局状态,必须唯一。这时,就需要单例模式来帮忙。


二、结构与类图

单例模式的结构非常简单,包含三个关键要素:

  1. 私有构造函数:阻止外部实例化
  2. 静态私有指针:保存唯一实例
  3. 公开的静态方法:对外提供访问点

简化类图如下:

+-----------------+
|   Singleton     |
+-----------------+
| - instance      |
| - Singleton()   |
+-----------------+
| + getInstance() |
+-----------------+

三、C++实现方式

✅ C++11 懒汉式(推荐)

class Singleton {
private:
    Singleton() {}                     // 私有构造函数
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

public:
    static Singleton* getInstance() {
        static Singleton instance;     // 局部静态变量,线程安全(C++11)
        return &instance;
    }
};

🚫 不推荐写法(线程不安全懒汉式)

class Singleton {
private:
    static Singleton* instance;
    Singleton() {}
public:
    static Singleton* getInstance() {
        if (!instance)
            instance = new Singleton();  // 多线程可能创建多个实例
        return instance;
    }
};
Singleton* Singleton::instance = nullptr;

四、适用场景

场景理由
日志系统统一记录日志,避免多个实例重复创建文件等
配置文件加载器系统初始化时加载一次,后续使用共享配置
数据库连接池控制连接数量,避免资源滥用
操作系统核心对象比如内核、任务调度器等只应存在一个实例

五、优缺点分析

✅ 优点:

  • 控制类的实例数量(仅一个)
  • 提供全局访问点
  • 延迟加载、节省资源(懒汉式)

❌ 缺点:

  • 不易扩展,可能违反开闭原则
  • 在多线程环境下实现需特别小心
  • 单例对象难以单元测试(耦合高)

六、今日练习题

✍️ 题目一:

请使用 C++ 实现一个线程安全的单例类 Logger,要求:

  • 构造函数私有
  • 拷贝构造和赋值运算符禁用
  • 多线程环境中保证唯一性

✍️ 题目二:

请思考并回答:

单例模式是否违反了开闭原则?如果是,原因是什么?


七、滚动复习:

由于今天是学习计划的第一天,无需复习内容。从明天起,每篇文章末尾将加入1~2个前面学过的设计模式重点回顾。


八、小结

单例模式是一种结构简单、思想明确的设计模式。它在实际工程中广泛应用,但也容易被滥用或实现不当。务必根据场景是否需要唯一实例来选择是否使用。

明日主题预告:工厂方法模式(Factory Method) —— 更灵活的对象创建方式,敬请期待!

相关文章:

  • 《Operating System Concepts》阅读笔记:p495-p511
  • argparse的使用
  • 【前端】【React】第四章:深入理解 React Router 及前端路由管理
  • 使用 mpstat 与 stress-ng 进行 CPU 性能监控
  • 从0到1的数据结构教程——深入思考动态数组
  • 记录一下最近参与实习 外包 社招流程里的一些感悟
  • Java EE(18)——网络原理——应用层HTTP协议
  • 内网渗透-网络分离免杀
  • git --- cherry pick
  • 深入解析C++模板:从基础到高级应用
  • AI Agent开发大全第十五课-零售智能导购Agent的代码实现
  • Nginx RTMP 处理模块 (ngx_rtmp_handler.c) 详细分析
  • 1371. 货币系统-dp背包问题
  • Oracle数据库数据编程SQL<3.4 PL/SQL 自定义函数>
  • HarmonyOSNext_API16_Tabs组件
  • 架构师面试(二十三):负载均衡
  • Spring AI 实现 STDIO和SSE MCP Server
  • C++ STL常用算法之常用查找算法
  • 智能体的学习(一)
  • k8s日志管理
  • 自适应网站开发/seo的优化方案
  • 网站信任的体验如何做/佳木斯seo
  • 鲅鱼圈网站建设/百度搜索引擎推广怎么弄
  • 网站优化与SEO区别/dw网页制作教程
  • h5都用什么网站/鞍山seo外包
  • 内江规划建设教育网站/交换友情链接