本文选取了设计模式:单例模式、观察者模式、工厂模式
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 会带来以下问题:
- 客户端与具体类强耦合:一旦需要更换产品类(例如从 FileLogger 换成 DbLogger),所有 new 的地方都要改。
- 创建逻辑复杂:某些对象的构造需要很多参数、配置、条件判断,把这些代码散落在各处会导致重复和难以维护。
- 难以扩展:增加新产品时,必须修改所有使用 new 的客户端,违反开闭原则。
- 测试困难:无法方便地替换为 Mock 对象进行单元测试。
工厂模式通过引入一个中间层(工厂)解决这些问题,使创建对象与使用对象分离。