项目整理——设计模式

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

选自【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 对象进行单元测试。

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

相关推荐
博风11 小时前
8、设计模式应用举例:适配器模式:Iterator接口与Enumeration接口
设计模式·适配器模式
高晶13 小时前
ARM 嵌入式 Linux 系统 U-Boot 开发与移植实战M
设计模式·程序员
geovindu18 小时前
rust: Chain of Responsibility Pattern
开发语言·后端·设计模式·rust·责任链模式·行为模式
拆房老料19 小时前
【第四部分:Agentic 智能体设计模式】15.为什么 Agent 也需要设计模式
人工智能·设计模式·ai·ai-native
Infedium19 小时前
信创工业软件移植实战:Windows synchapi.h同步API在国产操作系统落地案例
spark·软件需求
geovindu20 小时前
rust: Chain of Responsibility Pattern (续)
开发语言·后端·设计模式·rust·责任链模式·行为模式
Lost of 程序猿20 小时前
责任链模式实战:审批流里“层层把关“的艺术
后端·设计模式·asp.net·责任链模式
希洛兔2 天前
状态模式详解:让对象随内部状态自动改变行为
java·设计模式·状态模式
博风2 天前
7、设计模式应用举例:策略模式:加密、解密文件
设计模式·策略模式
4SAPI2 天前
Provider Adapter设计模式:如何让AI应用支持多个模型
网络·人工智能·设计模式