购买与学习资源
- 京东购买链接:Yocto项目实战教程:高效定制嵌入式Linux系统
- B站配套视频:嵌入式Jerry
设计模式分类详解与实战练习
📖 本文为系统学习设计模式分类的最佳资料,适合面向对象编程开发人员阅读与备考。内容结构合理,适合做学习笔记与面试准备。
一、什么是设计模式
1.1 设计模式的定义
设计模式(Design Pattern)是被反复使用、为大多数人所知的、经过分类总结的代码设计经验。它并不是具体的代码,而是解决特定问题的一种“套路”,即可复用的解决方案。
通俗理解
设计模式就像软件开发中的“通用公式”或“建筑蓝图”,不是直接可运行的代码,而是一种指导思想与结构组织方式。
1.2 为什么要学习设计模式
- 提升代码复用性和可维护性。
- 让团队开发有共同语言,减少沟通成本。
- 减少重复造轮子,避免走弯路。
- 提升架构水平,系统性理解优秀代码结构。
二、设计模式的三大分类
设计模式经典的三大类,分别为创建型模式、结构型模式、行为型模式。这是“GoF”书中(《设计模式:可复用面向对象软件的基础》)的标准分类,已成为业界共识。
2.1 创建型模式(Creational Patterns)
关注点:如何创建对象,隐藏对象创建逻辑,简化对象的生成与配置。
常见模式:
- 单例模式(Singleton)
- 工厂方法模式(Factory Method)
- 抽象工厂模式(Abstract Factory)
- 建造者模式(Builder)
- 原型模式(Prototype)
2.2 结构型模式(Structural Patterns)
关注点:如何组织、组合类与对象,形成更大的结构。
常见模式:
- 适配器模式(Adapter)
- 桥接模式(Bridge)
- 组合模式(Composite)
- 装饰器模式(Decorator)
- 外观模式(Facade)
- 享元模式(Flyweight)
- 代理模式(Proxy)
2.3 行为型模式(Behavioral Patterns)
关注点:类与对象之间的通信与职责分配。
常见模式:
- 责任链模式(Chain of Responsibility)
- 命令模式(Command)
- 解释器模式(Interpreter)
- 迭代器模式(Iterator)
- 中介者模式(Mediator)
- 备忘录模式(Memento)
- 观察者模式(Observer)
- 状态模式(State)
- 策略模式(Strategy)
- 模板方法模式(Template Method)
- 访问者模式(Visitor)
三、设计模式全景结构图
┌────────────┬───────────────────────────┐
│ 创建型模式 │ 结构型模式 │
├────────────┼───────────────────────────┤
│ 单例 │ 适配器、桥接、装饰器 │
│ 工厂方法 │ 组合、外观、享元、代理 │
│ 抽象工厂 │ │
│ 建造者 │ │
│ 原型 │ │
└────────────┴───────────────────────────┘
│
▼
┌─────────────────────────┐
│ 行为型模式 │
├─────────────────────────┤
│ 责任链、命令、解释器 │
│ 迭代器、中介者、备忘录 │
│ 观察者、状态、策略 │
│ 模板方法、访问者 │
└─────────────────────────┘
四、各类设计模式代表性模式精要
4.1 创建型模式简析
4.1.1 单例模式(Singleton)
- 目的:保证某个类在系统中只有一个实例,并提供全局访问点。
- 场景:如配置管理、日志系统、数据库连接池。
- 核心思想:构造函数私有,提供静态方法返回唯一实例。
class Singleton {
private:
static Singleton* instance;
Singleton() {}
public:
static Singleton* getInstance() {
if (!instance)
instance = new Singleton();
return instance;
}
};
Singleton* Singleton::instance = nullptr;
4.1.2 工厂方法模式(Factory Method)
- 目的:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
- 核心思想:将对象的创建与使用解耦。
4.1.3 抽象工厂模式(Abstract Factory)
- 目的:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
- 典型应用:跨平台 UI 工具包。
4.1.4 建造者模式(Builder)
- 目的:将一个复杂对象的构建与其表示分离,使同样的构建过程可以创建不同的表示。
4.1.5 原型模式(Prototype)
- 目的:通过复制已有实例来创建新的对象,避免耗时的初始化过程。
4.2 结构型模式简析
4.2.1 适配器模式(Adapter)
- 目的:将一个类的接口转换成客户端期望的另一个接口,解决接口不兼容问题。
- 典型应用:如老接口适配新系统。
4.2.2 装饰器模式(Decorator)
- 目的:动态地给对象添加额外功能,比继承更灵活。
- 典型应用:Java IO 流。
4.2.3 代理模式(Proxy)
- 目的:为其他对象提供一种代理以控制对这个对象的访问。
- 典型应用:远程代理、安全代理、虚拟代理。
4.3 行为型模式简析
4.3.1 观察者模式(Observer)
- 目的:当一个对象状态发生变化时,依赖它的所有对象都会收到通知并自动更新。
- 典型应用:事件监听、MVC 模式。
4.3.2 策略模式(Strategy)
- 目的:定义一系列算法,将每个算法封装起来,让它们可以互换。
- 典型应用:排序算法的切换、加密算法。
4.3.3 状态模式(State)
- 目的:允许对象在内部状态变化时改变其行为,对象看起来好像修改了自身的类。
- 典型应用:游戏角色状态切换。
五、常见设计模式选择与应用场景总结
分类 | 代表模式 | 适用场景 | 优势 |
---|---|---|---|
创建型 | 单例 | 全局唯一资源/对象 | 控制资源,易于管理 |
创建型 | 工厂方法 | 对象种类多,动态创建 | 解耦具体类,提高灵活性 |
创建型 | 建造者 | 复杂对象多步骤创建 | 分离构建与表示 |
结构型 | 适配器 | 兼容不同接口 | 复用旧代码,接口转换 |
结构型 | 装饰器 | 动态功能扩展 | 灵活组合功能,无需继承 |
结构型 | 代理 | 访问控制、延迟、远程调用 | 控制访问、保护原始对象 |
行为型 | 观察者 | 发布-订阅、事件驱动 | 解耦,动态响应变化 |
行为型 | 策略 | 算法多样且可切换 | 可扩展、替换、代码复用 |
行为型 | 状态 | 状态多变且行为切换 | 状态逻辑独立,易扩展 |
六、设计模式分类核心记忆口诀
创建型问对象,结构型谈搭建,行为型重分工。
- 创建型:怎么创建(单例、工厂、建造、抽象工厂、原型)
- 结构型:怎么组合(适配器、装饰器、代理、桥接、外观、组合、享元)
- 行为型:怎么协作(责任链、命令、解释器、迭代器、中介者、备忘录、观察者、状态、策略、模板方法、访问者)
七、设计模式分类模拟题练习
题目 1:设计模式基础分类题
问题:请问下列哪一项属于结构型设计模式?
A. 单例模式
B. 装饰器模式
C. 观察者模式
D. 工厂方法模式
题目 2:应用场景判断题
问题:某个项目需要为核心类对象添加日志和权限校验功能,但又不想修改原有代码,也不希望通过复杂的多重继承。请问应该选用哪种设计模式?
A. 代理模式
B. 工厂方法
C. 观察者模式
D. 单例模式
题目 3:分类归纳题
问题:下列设计模式按三大类归属于哪一类?
- 原型模式
- 组合模式
- 状态模式
- 命令模式
请写出每个模式所属类别。
参考答案 - 原型模式:创建型 - 组合模式:结构型 - 状态模式:行为型 - 命令模式:行为型题目 4:案例分析题
问题:你正在开发一款支持不同数据库(MySQL、SQLite、PostgreSQL)的应用,需要根据不同数据库类型动态切换底层实现。请问应该采用哪种设计模式?
A. 观察者模式
B. 策略模式
C. 工厂方法模式
D. 建造者模式
题目 5:开放问答题
问题:简要说明行为型设计模式的主要关注点,以及举例说明一种行为型模式的应用场景。
参考答案 - 行为型设计模式关注对象或类之间的职责划分、通信与协作。 - 典型应用如“观察者模式”,在 GUI 程序、消息订阅发布系统中广泛应用,一旦主题对象发生变化,自动通知所有观察者进行响应。八、总结与思维导图
8.1 设计模式分类结构思维导图
设计模式
├── 创建型
│ ├── 单例
│ ├── 工厂方法
│ ├── 抽象工厂
│ ├── 建造者
│ └── 原型
├── 结构型
│ ├── 适配器
│ ├── 桥接
│ ├── 装饰器
│ ├── 组合
│ ├── 外观
│ ├── 享元
│ └── 代理
└── 行为型
├── 责任链
├── 命令
├── 解释器
├── 迭代器
├── 中介者
├── 备忘录
├── 观察者
├── 状态
├── 策略
├── 模板方法
└── 访问者
8.2 重点回顾
- 设计模式三大分类是面试、架构必备常识。
- 分类清晰,理解创建、结构、行为三大类别的核心思想。
- 掌握常见代表模式及其应用场景,能快速根据实际问题匹配设计模式。
- 多做题,多总结,多实践,才能真正学会设计模式。
九、拓展:如何高效学习设计模式
- 理解分类,不要死记硬背。
- 结合实际项目多用,比如用工厂方法封装对象创建、用观察者实现消息推送等。
- 画结构图和流程图,帮助记忆。
- 总结常用模式优缺点、适用场景。
- 刷真题,多看开源项目代码实现。
十、推荐书籍与学习资源
- 《设计模式:可复用面向对象软件的基础》(GoF)
- 《Head First 设计模式》
- refactoring.guru 网站设计模式专栏
- 各大开源框架源码分析(Spring、Qt、Boost)
结语
设计模式的学习是一场系统性的思维训练,也是成为高级程序员的必经之路。希望本文对你建立完整的知识体系有所帮助,更多实际编程例子和详尽讲解,欢迎持续关注。
购买与学习资源
- 京东购买链接:Yocto项目实战教程:高效定制嵌入式Linux系统
- B站配套视频:嵌入式Jerry