项目整理——设计模式

本文选取了设计模式:单例模式、观察者模式、工厂模式

选自【https://refactoring.guru/

1. 单例模式 Singleton

概念

单例 是一种创建设计模式,确保一个类只有一个实例,同时提供对该实例的全局访问点

在常规的面向对象编程中,每次使用 new 或构造函数创建对象,都会在堆或栈上分配一块新的内存,得到一个全新的对象地址和内容,代表一个独立的全新实体;然而,单例模式正是刻意打破这一常规。它的目的就是阻止外部随意创建多个实例,并确保整个程序中某个类有且仅有一个实例。因此,++无论你调用多少次 instance() 方法,它返回的都是同一个对象的地址++------所有调用者看到的是同一个对象,修改它的状态会影响到所有使用该单例的地方。

  • 常规创建对象 → 每次都是全新的实例(不同地址)。

  • 单例模式 → 强制全局唯一实例(相同地址)。

2. 观察者模式 Observer

又名:发布---订阅模式

概念

观察者模式 (Observer Pattern)是一种行为型设计模式 ,它定义了对象之间的一对多依赖关系:当一个对象(主题 Subject )的状态发生改变时,所有依赖于它的对象(观察者 Observer)都会得到通知并自动更新。

Qt中观察者模式的使用

Qt 框架广泛使用了观察者模式,最典型的就是信号与槽(Signals & Slots) 机制。信号相当于主题,槽函数相当于观察者。

  • **信号(signal):**当对象状态改变时发射(emit)的信号,类似主题的 notify()。

  • **槽(slot):**响应信号的函数,相当于观察者的 update()。

  • **连接(connect):**将信号与槽绑定,支持一对多、多对一。

观察者模式的优缺点

优点 缺点
支持松耦合:主题只知道观察者接口,不关心具体类。 如果观察者太多,通知可能性能下降
广播通信:一条通知可到达多个观察者。 可能产生循环依赖:观察者再更新主题导致无限循环。
符合开闭原则:增加新观察者无需修改主题。 如果观察者更新顺序重要,需要额外管理。
Qt 信号槽自动管理生命周期,避免内存泄漏。 过度使用会使程序流程难以追踪(尤其是多线程异步)。

3. 工厂模式

概念

工厂模式是一种创建型设计模式 ,它将对象的创建与使用分离。客户端不需要知道具体类名和创建细节,只需通过一个共同的接口或工厂方法来请求所需对象。

也就是说,在工厂模式下,不选择直接new对象,而是通过一个"工厂"来生产对象。客户端只需要告诉工厂"我要什么类型",工厂负责构造并返回合适的产品。

工厂模式的三个变体:

变体 定义 关键特点
简单工厂 一个工厂类根据传入的参数返回不同的产品实例。 工厂类包含创建逻辑,常使用静态方法。 如:一个系统需要根据不同客户端,有针对性的支持多种日志输出(文件、数据库、控制台)
工厂方法 定义一个创建产品的抽象接口(工厂方法),由子类决定实例化哪个产品。 每个具体产品对应一个具体工厂。 如:一个应用需要在不同平台(Windows、Linux)上生成不同类型的文档(PDF、Word)。这样每个平台对接口的实现都不同
抽象工厂 创建一系列相关或相互依赖的产品族,而无需指定它们的具体类。 一个工厂可以创建多个不同类型的产品。 如:一个应用支持两种皮肤:Light 和 Dark。每种皮肤包含 Button、CheckBox、ScrollBar 等控件。

开发过程中使用工厂模式的原因

在实际项目中,直接使用 new 会带来以下问题:

  1. 客户端与具体类强耦合:一旦需要更换产品类(例如从 FileLogger 换成 DbLogger),所有 new 的地方都要改。
  2. 创建逻辑复杂:某些对象的构造需要很多参数、配置、条件判断,把这些代码散落在各处会导致重复和难以维护。
  3. 难以扩展:增加新产品时,必须修改所有使用 new 的客户端,违反开闭原则。
  4. 测试困难:无法方便地替换为 Mock 对象进行单元测试。

工厂模式通过引入一个中间层(工厂)解决这些问题,使创建对象与使用对象分离。

相关推荐
略略略咯咯8 小时前
(总结)设计模式
设计模式
Cosolar21 小时前
DeepSeek Harness 理解 Harness 的设计哲学 - 可组合的插件运行时
人工智能·设计模式·架构
Nebula_g1 天前
JavaSE基础语法:特殊类(特殊情景下的设计模式)
java·开发语言·设计模式
George_Ye2 天前
同一本书,一人一份:我如何设计 AI 个性化扫书报告
设计模式
莫得感情 o2 天前
设计模式 22 · 三个冷门模式:中介者、访问者、解释器
java·设计模式
AI人工智能+电脑小能手3 天前
大白话说Java设计模式-08-建造者模式(业务实战篇)
java·设计模式·建造者模式·架构设计·对象构建
AustinXu3 天前
从 Claude Code 到 Claude Tag,Harness Engineering 走到了组织这一层
设计模式·团队管理
剧中有戏3 天前
单例模式从入门到精通:一个数据库连接池的完整剖析
设计模式
胡萝卜术3 天前
编译期与运行期的双重防线:从 TypeScript 类型之争到 LLM 输出的自动化择优
前端·设计模式·面试
货拉拉技术3 天前
重塑 Agent 度量衡:基于 LLM-as-a-Judge 的离线评估体系与实践
算法·设计模式