Java 中的设计模式分为三大类:创建型模式、结构型模式和行为型模式,共计 23 种。以下是核心设计模式的详细介绍:
一、创建型模式(5 种)
1. 单例模式(Singleton)
- 意图:确保一个类只有一个实例,并提供全局访问点。
- 应用场景:
- 配置管理器(如 Spring 的 ApplicationContext)
- 数据库连接池
- 日志记录器
- 实现思路:
- 私有化构造函数
- 静态实例变量
- 线程安全的获取方法(如双重检查锁定)
2. 工厂模式(Factory)
- 意图:定义创建对象的接口,让子类决定实例化哪个类。
- 应用场景:
- 对象创建逻辑复杂时(如参数校验、依赖初始化)
- 根据条件动态创建对象(如支付方式工厂)
- 实现思路:
- 抽象工厂类 / 接口
- 具体工厂类实现创建逻辑
3. 抽象工厂模式(Abstract Factory)
- 意图:提供一个创建一系列相关对象的接口,无需指定具体类。
- 应用场景:
- 系统需要独立于产品的创建、组合和表示(如 UI 组件工厂)
- 多版本产品族(如不同操作系统的 GUI 元素)
- 实现思路:
- 抽象工厂定义多个产品创建方法
- 具体工厂实现多个产品族的创建
4. 建造者模式(Builder)
- 意图:将复杂对象的构建与其表示分离,使同样的构建过程可以创建不同的表示。
- 应用场景:
- 对象参数众多且组合复杂(如 SQL 查询构建器)
- 分步构建对象(如游戏角色创建)
- 实现思路:
- 导演类(Director)控制构建流程
- 具体建造者实现部件构建
5. 原型模式(Prototype)
- 意图:通过复制现有实例来创建新实例,无需知道创建细节。
- 应用场景:
- 对象创建成本高(如初始化耗时、资源密集)
- 动态生成对象(如游戏中的角色克隆)
- 实现思路:
- 实现 Cloneable 接口并重写 clone () 方法
- 深拷贝与浅拷贝的选择
二、结构型模式(7 种)
6. 代理模式(Proxy)
- 意图:为其他对象提供一种代理以控制对这个对象的访问。
- 应用场景:
- 远程代理(如 RMI)
- 虚拟代理(延迟加载大对象)
- 保护代理(权限控制)
- 实现思路:
- 代理类与目标类实现相同接口
- 代理类持有目标类引用并增强功能
7. 适配器模式(Adapter)
- 意图:将一个类的接口转换成客户希望的另一个接口。
- 应用场景:
- 旧系统接口适配新需求(如 LegacyRectangle→Shape 接口)
- 第三方库接口适配(如不同支付网关的统一接口)
- 实现思路:
- 类适配器(继承适配)
- 对象适配器(组合适配)
8. 装饰器模式(Decorator)
- 意图:动态地给一个对象添加额外职责,比继承更灵活。
- 应用场景:
- 功能动态增强(如 Java IO 流的包装)
- 权限控制叠加(如用户角色装饰)
- 实现思路:
- 抽象组件接口
- 具体组件类
- 装饰器基类实现组件接口并持有组件引用
9. 外观模式(Facade)
- 意图:为子系统中的一组接口提供统一的高层接口,简化调用。
- 应用场景:
- 复杂系统的简化入口(如电商下单流程整合)
- 第三方库封装(如 Apache Commons 的 IOUtils)
- 实现思路:
- 外观类封装多个子系统的交互逻辑
10. 桥接模式(Bridge)
- 意图:将抽象部分与实现部分分离,使它们可以独立变化。
- 应用场景:
- 多维变化的系统(如不同数据库 + 不同日志实现)
- 避免继承导致的类爆炸
- 实现思路:
- 抽象化角色持有实现化角色引用
- 实现化角色定义具体行为
11. 组合模式(Composite)
- 意图:将对象组合成树形结构以表示 “部分 - 整体” 的层次结构。
- 应用场景:
- 文件系统、菜单系统、组织架构
- 统一处理叶子节点和组合节点
- 实现思路:
- 抽象组件定义公共接口
- 叶子节点和组合节点实现该接口
12. 享元模式(Flyweight)
- 意图:运用共享技术有效地支持大量细粒度的对象。
- 应用场景:
- 缓存大量相似对象(如文本编辑器中的字符)
- 游戏中的粒子系统
- 实现思路:
- 享元工厂管理共享对象池
- 内部状态(共享)与外部状态(不共享)分离
三、行为型模式(11 种)
13. 观察者模式(Observer)
- 意图:定义对象间的一对多依赖,当一个对象状态改变时,所有依赖者都会收到通知。
- 应用场景:
- 事件驱动系统(如 GUI 事件处理)
- 发布 - 订阅系统(如消息队列)
- 实现思路:
- 主题接口(Subject)定义注册 / 注销 / 通知方法
- 观察者接口(Observer)定义更新方法
14. 策略模式(Strategy)
- 意图:定义一系列算法,将每个算法封装起来,并使它们可以相互替换。
- 应用场景:
- 多种算法选择(如排序算法、支付方式)
- 避免大量 if-else 或 switch 语句
- 实现思路:
- 策略接口定义算法行为
- 具体策略类实现不同算法
- 上下文类持有策略引用
15. 状态模式(State)
- 意图:允许对象在内部状态改变时改变它的行为,看起来好像修改了它的类。
- 应用场景:
- 工作流状态转换(如订单状态)
- 游戏角色状态管理
- 实现思路:
- 状态接口定义状态行为
- 具体状态类实现行为
- 上下文类维护当前状态
16. 责任链模式(Chain of Responsibility)
- 意图:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。
- 应用场景:
- 多级审批流程
- 过滤器链(如 Servlet Filter)
- 实现思路:
- 处理者接口定义处理方法和设置下一个处理者的方法
- 具体处理者实现处理逻辑并传递请求
17. 命令模式(Command)
- 意图:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化。
- 应用场景:
- 撤销 / 重做操作(如文本编辑器)
- 任务队列(如线程池)
- 实现思路:
- 命令接口定义执行方法
- 具体命令类封装接收者和动作
- 调用者持有命令对象
18. 模板方法模式(Template Method)
- 意图:定义一个操作中的算法骨架,将一些步骤延迟到子类中。
- 应用场景:
- 流程固定但步骤实现可变(如 JUnit 测试框架)
- 框架开发(如 Spring MVC 的 HandlerAdapter)
- 实现思路:
- 抽象类定义模板方法和基本操作
- 具体子类实现可变步骤
19. 访问者模式(Visitor)
- 意图:表示一个作用于某对象结构中的各元素的操作,使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。
- 应用场景:
- 复杂对象结构的操作扩展(如 XML 解析器)
- 报表生成器
- 实现思路:
- 访问者接口定义对每个元素的访问方法
- 元素接口接受访问者
- 具体元素类实现接受逻辑
20. 中介者模式(Mediator)
- 意图:用一个中介对象来封装一系列的对象交互,使各对象不需要显式地相互引用。
- 应用场景:
- 聊天室、MVC 中的 Controller
- 系统模块间复杂交互
- 实现思路:
- 中介者接口定义协调方法
- 具体中介者管理同事对象并实现协调逻辑
21. 迭代器模式(Iterator)
- 意图:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。
- 应用场景:
- 集合遍历(如 Java 的 Iterator)
- 自定义数据结构遍历
- 实现思路:
- 迭代器接口定义遍历方法
- 具体迭代器实现遍历逻辑
- 聚合接口定义创建迭代器的方法
22. 解释器模式(Interpreter)
- 意图:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
- 应用场景:
- 简单语法解析(如 SQL WHERE 子句)
- 正则表达式引擎
- 实现思路:
- 抽象表达式定义解释方法
- 终结符表达式和非终结符表达式实现解释逻辑
23. 备忘录模式(Memento)
- 意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
- 应用场景:
- 撤销操作(如文本编辑器的历史记录)
- 游戏存档
- 实现思路:
- 备忘录类存储原发器状态
- 原发器创建和恢复备忘录
- 管理者保存和提供备忘录
总结
设计模式的核心价值在于:
- 解耦:降低模块间的依赖
- 复用:提高代码可复用性
- 扩展:支持系统灵活扩展
- 维护:使代码结构清晰,易于维护