23种设计模式概览
23种设计模式详解(基于GoF经典分类)
设计模式是前辈程序员在解决软件设计问题时总结的可复用方案。根据GoF(四人帮)的分类,23种设计模式可分为创建型、结构型和行为型三大类。以下是详细解析:
一、创建型模式(5种)
核心目标:优化对象的创建过程,提升灵活性和资源管理效率。
- 工厂方法模式(Factory Method)
- 机制:定义一个创建对象的接口,由子类决定实例化哪个类。
- 场景:需要延迟实例化或子类决定具体类时(如JDBC驱动加载)。
- 示例:
LoggerFactory
根据配置返回FileLogger
或DatabaseLogger
。
- 抽象工厂模式(Abstract Factory)
- 机制:创建一系列相关或依赖对象,无需指定具体类。
- 场景:需要产品族(如不同操作系统主题组件)时。
- 示例:
GUIFactory
生成WindowsButton
和MacButton
。
- 单例模式(Singleton)
- 机制:确保类唯一实例,提供全局访问点。
- 场景:日志记录、线程池、配置管理器等需唯一资源的场景。
- 实现:双重检查锁(DCL)或静态内部类方式。
- 建造者模式(Builder)
- 机制:分离复杂对象构建与表示,支持分步构建。
- 场景:对象构造过程复杂且需灵活组合时(如游戏角色装备搭配)。
- 示例:
ComputerBuilder
分步设置CPU、内存、硬盘。
- 原型模式(Prototype)
- 机制:通过复制原型创建新对象,避免重复初始化。
- 场景:对象创建成本高或需保留原始状态时(如Excel模板复制)。
- 实现:
clone()
方法深度复制对象。
二、结构型模式(7种)
核心目标:构建高效、可扩展的系统结构,降低类与对象间的耦合。
- 适配器模式(Adapter)
- 机制:转换接口以兼容不兼容的类。
- 场景:旧系统集成或第三方库适配(如电压转换器)。
- 示例:
LegacySystemAdapter
将旧API转换为新接口。
- 桥接模式(Bridge)
- 机制:抽象与实现分离,独立变化。
- 场景:需多维度扩展时(如跨平台绘图工具:Windows/Mac + 矢量/位图)。
- 示例:
DrawingAPI
分离WindowsRenderer
和MacRenderer
。
- 组合模式(Composite)
- 机制:树形结构表示部分-整体,统一访问。
- 场景:文件系统、组织架构管理。
- 示例:
File
和Folder
统一处理为Component
。
- 装饰器模式(Decorator)
- 机制:动态添加对象职责,替代继承。
- 场景:需灵活扩展功能时(如咖啡订单:浓缩+奶泡+糖浆)。
- 示例:
Beverage
通过MilkDecorator
和SugarDecorator
动态添加配料。
- 外观模式(Facade)
- 机制:简化复杂子系统接口。
- 场景:API封装或新手引导流程。
- 示例:
ComputerFacade
一键启动CPU、内存、硬盘。
- 享元模式(Flyweight)
- 机制:共享细粒度对象,减少资源消耗。
- 场景:大量相似对象场景(如五子棋棋子)。
- 示例:
ChessPieceFactory
复用黑白棋子对象。
- 代理模式(Proxy)
- 机制:控制对象访问,添加间接层。
- 场景:权限控制、远程调用或日志记录(如明星经纪人)。
- 示例:
ImageProxy
延迟加载大图资源。
三、行为型模式(11种)
核心目标:增强对象间通信与协作,提升代码复用和可维护性。
- 责任链模式(Chain of Responsibility)
- 机制:请求沿处理链传递,直至被处理。
- 场景:权限审批、异常拦截。
- 示例:
ApprovalHandler
链式处理请假申请。
- 命令模式(Command)
- 机制:请求封装为对象,支持撤销/重做。
- 场景:操作日志、任务队列(如文本编辑器撤销功能)。
- 示例:
TextEditorCommand
记录复制、粘贴操作。
- 解释器模式(Interpreter)
- 机制:解释语言文法,构建解释器。
- 场景:简单规则引擎或数学表达式解析。
- 示例:
MathExpressionInterpreter
解析并计算表达式。
- 迭代器模式(Iterator)
- 机制:统一访问集合元素,不暴露内部结构。
- 场景:遍历容器对象(如Java集合框架)。
- 示例:
ListIterator
遍历ArrayList
。
- 中介者模式(Mediator)
- 机制:封装对象交互,降低耦合。
- 场景:聊天室、航班预订系统。
- 示例:
ChatRoomMediator
协调用户消息发送。
- 备忘录模式(Memento)
- 机制:捕获对象状态,支持恢复。
- 场景:游戏存档、撤销操作。
- 示例:
GameSnapshot
保存/恢复游戏进度。
- 观察者模式(Observer)
- 机制:定义一对多依赖,状态变化通知观察者。
- 场景:事件驱动系统、股票报价更新。
- 示例:
StockTicker
通知所有订阅者价格变动。
- 状态模式(State)
- 机制:对象行为随状态改变。
- 场景:订单状态机、电梯控制。
- 示例:
Order
在Pending
、Shipped
、Delivered
状态切换行为。
- 策略模式(Strategy)
- 机制:封装可互换算法,动态选择。
- 场景:支付方式切换、排序算法选择。
- 示例:
SortStrategy
根据参数选择快速排序或归并排序。
- 模板方法模式(Template Method)
- 机制:定义算法骨架,子类实现步骤。
- 场景:框架设计、算法复用(如Spring MVC处理流程)。
- 示例:
DataProcessor
定义validate()
、process()
抽象方法。
- 访问者模式(Visitor)
- 机制:操作作用于对象结构,不修改类。
- 场景:报表生成、编译器语法分析。
- 示例:
TaxVisitor
计算不同Item
的税费。
设计模式选择原则
- 开闭原则:对扩展开放,对修改关闭。
- 单一职责:一个类只负责一个功能。
- 里氏替换:子类可替换父类而不影响程序。
- 依赖倒置:依赖抽象而非具体实现。
通过合理选择设计模式,可显著提升代码的可读性、可维护性和可扩展性。实际应用中需结合场景权衡,避免过度设计。后续将会有一系列的学习研究,采用java语言的实际例子,针对这23种设计模式做一个详细分解。