设计模式按照 GoF(Gang of Four) 经典分类,分为三大类、23种模式。下面按类别梳理:
一、创建型模式(Creational)
核心问题:对象怎么创建? 将对象的创建与使用分离。
| 模式 | 一句话说明 | 典型场景 |
|---|---|---|
| 单例 Singleton | 全局只有一个实例 | 配置管理器、线程池、日志器 |
| 工厂方法 Factory Method | 由子类决定创建哪种对象 | 日志记录器(文件/数据库/控制台) |
| 抽象工厂 Abstract Factory | 创建一族相关对象 | 跨平台UI(Windows风格/Mac风格控件) |
| 建造者 Builder | 分步构建复杂对象 | 构建复杂的查询语句、组装电脑配置 |
| 原型 Prototype | 通过克隆已有对象来创建新对象 | 对象拷贝开销大、需要大量相似对象 |
二、结构型模式(Structural)
核心问题:类和对象怎么组合? 关注如何组装类/对象形成更大结构。
| 模式 | 一句话说明 | 典型场景 |
|---|---|---|
| 适配器 Adapter | 让接口不兼容的类能一起工作 | 旧系统接口对接新系统、第三方SDK封装 |
| 桥接 Bridge | 将抽象与实现分离,独立变化 | 跨平台图形绘制(形状 × 渲染API) |
| 组合 Composite | 树形结构,统一处理单个和组合对象 | 文件系统(文件/文件夹)、菜单/子菜单 |
| 装饰器 Decorator | 动态地给对象添加额外职责 | Java I/O流、给组件加边框/滚动条 |
| 外观 Facade | 为复杂子系统提供简单入口 | 一键下单(库存+支付+物流的统一接口) |
| 享元 Flyweight | 共享细粒度对象,减少内存 | 字符串常量池、棋盘棋子、图标缓存 |
| 代理 Proxy | 为对象提供替身以控制访问 | 远程代理、缓存代理、权限控制、懒加载 |
三、行为型模式(Behavioral)
核心问题:对象之间怎么通信? 关注对象间的职责分配和交互方式。
| 模式 | 一句话说明 | 典型场景 |
|---|---|---|
| 策略 Strategy | 封装可互换的算法族 | 排序算法切换、支付方式选择 |
| 模板方法 Template Method | 定义骨架,子类填充步骤 | 数据导出流程(读取→处理→输出) |
| 观察者 Observer | 一对多依赖,状态变化自动通知 | 事件监听、消息订阅、MVC中的Model-View |
| 迭代器 Iterator | 统一遍历集合的方式 | Java的Iterator、for-each |
| 责任链 Chain of Responsibility | 将请求沿处理者链传递 | 审批流程、过滤器链、异常处理 |
| 命令 Command | 将请求封装为对象 | 撤销/重做、任务队列、宏命令 |
| 状态 State | 对象行为随内部状态改变 | 订单状态流转、TCP连接状态 |
| 访问者 Visitor | 在不修改类的前提下定义新操作 | 编译器对AST节点的不同操作 |
| 中介者 Mediator | 用一个对象封装对象间的交互 | 聊天室、航空管制塔台 |
| 备忘录 Memento | 捕获并恢复对象的历史状态 | 编辑器撤销、游戏存档 |
| 解释器 Interpreter | 定义语言的文法并解释执行 | 正则表达式、SQL解析、规则引擎 |
四、一张图记住分类逻辑
设计模式├── 创建型 → "怎么造?" → 控制对象创建过程├── 结构型 → "怎么装?" → 控制对象组合方式└── 行为型 → "怎么动?" → 控制对象协作方式
五、实用建议
- 最常用:单例、工厂、策略、观察者、装饰器、代理、模板方法 —— 这7个覆盖了日常80%的场景。
- 不要为了用模式而用模式,先识别问题(变化点、耦合点),再匹配模式。
- 很多框架本身就是模式的集合,例如 Spring(工厂+代理+模板方法+观察者)、Java I/O(装饰器+适配器)。