23种设计模式,分为创建型、结构型和行为型
一、创建型模式
对象创建与组合的解耦,将对象的创建和使用分离,是系统不依赖于具体类
| 模式 | 核心意图 | 典型场景 |
| 单例(Singleton) | 确保一个类只有一个实例,并提供全局访问点 | 配置管理、日志、数据库连接池 |
| 工厂方法(Factory Method) | 定义创建对象的接口,让子类决定实例化哪个类 | 框架扩展(如不同数据库驱动) |
| 抽象工厂(Abstract Factory) | 提供一个创建一系列相关或依赖对象的接口 | 跨平台UI(Windows/Mac控件) |
| 建造者(Builder) | 将复杂对象的构建与表示分离 | 构建 SQL 查询、HTTP 请求 |
| 原型(Prototype) | 通过复制现有对象创建新对象 | 游戏角色克隆、缓存对象 |
避坑指南
⒈陷阱1:“单例模式可通过全局变量替代” → 错!
①单例保证唯一性+延迟初始化
⒉陷阱2:“工厂方法与抽象工厂无区别” → 错!
①工厂方法:一个产品等级结构(如只创建数据库连接)
②抽象工厂:多个产品族(如同时创建按钮+文本框)
⒊陷阱3:“建造者模式用于创建简单对象” → 错!
①适用于复杂对象(多步骤、多部件)
二、结构型模式
类或对象组合的解耦,将类或对象组合成更大的结构,同时保持结构的灵活性和复用性。
| 模式 | 核心意图 | 典型场景 |
| 适配器(Adapter) | 将一个类的接口转换成客户期望的另一个接口 | 集成第三方库(如旧支付接口适配新系统) |
| 代理(Proxy) | 为其他对象提供一种代理以控制对该对象的访问 | 远程代理、虚拟代理(图片懒加载)、安全代理 |
| 装饰器(Decorator) | 动态地给对象添加额外职责 | IO 流(BufferedInputStream)、UI 组件边框 |
| 组合(Composite) | 将对象组合成树形结构以表示“部分-整体”层次 | 文件系统(文件/文件夹)、菜单树 |
| 桥接(Bridge) | 将抽象部分与实现部分分离,使它们可独立变化 | 多维度变化(如不同形状+不同颜色) |
| 外观(Facade) | 为子系统提供统一的高层接口 | 封装复杂库(如启动系统只需调用 start()) |
| 享元(Flyweight) | 运用共享技术有效支持大量细粒度对象 | 字符、游戏子弹、数据库连接池 |
避坑指南
⒈陷阱1:“适配器与代理无区别” → 错!
①适配器:接口转换(解决不兼容)
②代理:控制访问(增强原功能)
⒉陷阱2:“装饰器与继承无区别” → 错!
①装饰器动态组合,继承静态绑定
⒊陷阱3:“外观模式减少系统依赖” → 对! 这是其核心价值
三、行为型模式
对象间职责分配与通信解耦,在对象之间分配职责,使对象在不紧密耦合的情况下协同工作。
| 模式 | 核心意图 | 典型场景 |
| 观察者(Observer) | 定义对象间一对多依赖,当对象状态改变时,所有依赖者自动更新 | 事件监听、MVC 模型-视图同步 |
| 策略(Strategy) | 定义一系列算法,封装每个算法,并使它们可互换 | 支付方式(微信/支付宝)、排序算法 |
| 命令(Command) | 将请求封装为对象,使你能参数化客户、队列或日志请求 | 撤销/重做、任务队列、宏命令 |
| 模板方法(Template Method) | 定义算法骨架,将某些步骤延迟到子类 | 框架(如 Servlet doGet/doPost) |
| 状态(State) | 允许对象在其内部状态改变时改变其行为 | 订单状态(待支付→已发货→已完成) |
| 责任链(Chain of Responsibility) | 使多个对象都有机会处理请求,避免请求发送者与接收者耦合 | 审批流(组长→经理→总监) |
| 迭代器(Iterator) | 提供一种方法顺序访问聚合对象的元素,而不暴露其内部表示 | 集合遍历(List.iterator()) |
| 中介者(Mediator) | 用一个中介对象封装一系列对象交互 | 聊天室、GUI 组件协调 |
| 备忘录(Memento) | 在不破坏封装性的前提下,捕获并外部化对象内部状态 | 撤销操作、游戏存档 |
| 访问者(Visitor) | 表示一个作用于某对象结构中各元素的操作 | 文档结构解析、报表生成 |
| 解释器(Interpreter) | 给定语言文法,定义其解释器 | 规则引擎、简单表达式解析 |
避坑指南
⒈陷阱1:“观察者与发布-订阅无区别” → 错!
①观察者:同步,耦合强
②发布-订阅:异步,通过消息队列解耦(非GoF模式)
⒉陷阱2:“策略模式与状态模式相同” → 错!
①策略:客户端选择算法
②状态:对象内部状态驱动行为变化
⒊陷阱3:“命令模式就是回调函数” → 错!
①命令是对象化请求,支持队列、日志、撤销
tips:
| 误区 | 正确认知 |
| “单例模式不适用于多线程” | 可通过双重检查锁实现线程安全 |
| “装饰器就是继承” | 装饰器动态组合,继承静态绑定 |
| “适配器和代理都能加功能” | 适配器重在接口转换,代理重在访问控制 |
| “策略和状态都是切换行为” | 策略由外部选择,状态由内部驱动 |
| “观察者模式是异步的” | GoF 观察者是同步的 |



评论前必须登录!
注册