项目整理——设计模式

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

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

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

相关推荐
Zane19943 天前
一个 new 就能创建对象,为什么还要拆出单例、工厂、建造者、原型四种模式?
设计模式
kakakahahahaha3 天前
Windows C盘空间不足的安全清理与迁移流程
windows·电脑·笔记本电脑·软件需求·c盘清理
建筑工程企业管理系统3 天前
工程建设管理信息系统如何选型?多项目协同管控避坑指南
大数据·软件工程·软件需求
怕浪猫4 天前
一行命令复刻爆款视频,我把 Hypit 从安装跑到了出片
人工智能·设计模式·程序员
Zane19944 天前
函数式编程里的函数,其实不是你天天写的那个函数——三大编程范式的边界在哪
设计模式
kakakahahahaha5 天前
Windows Steam 游戏存档在哪里?定位和恢复排查流程
windows·其他·电脑·笔记本电脑·内容运营·软件需求
Zane19945 天前
策略模式现在该不该上?一次讲清楚过度设计和设计不足怎么找平衡
设计模式
她说..5 天前
常见设计模式-模板方法模式
java·spring·设计模式·springboot
xiaofeiyang1506 天前
第六章 · 桥接 — 三支毛笔,画出九种颜色
设计模式
Shadow(⊙o⊙)6 天前
OTOL设计模式 One Thread One Loop
服务器·网络·设计模式