设计模式
编程设计模式是解决软件设计中常见问题的经典解决方案,GoF(Gang of Four)提出的 23种设计模式 被广泛应用于实际开发中。以下是这些设计模式的分类和简要说明:
一、创建型模式(5种)
-
单例模式(Singleton Pattern)
- 作用:确保一个类只有一个实例,并提供全局访问点。
- 应用:数据库连接池、Spring框架中的
ApplicationContext等。
-
工厂方法模式(Factory Method Pattern)
- 作用:定义一个创建对象的接口,由子类决定实例化哪个类。
- 应用:Spring框架的
BeanFactory、日志框架(如 Log4j)的工厂类。
-
抽象工厂模式(Abstract Factory Pattern)
- 作用:提供一个创建一系列相关或相互依赖对象的接口,无需指定具体类。
- 应用:跨平台 UI 工具包(如 Windows 和 macOS 的按钮、文本框)。
-
建造者模式(Builder Pattern)
- 作用:将一个复杂对象的构建过程与其表示分离,逐步构建对象。
- 应用:构建复杂对象(如生成 HTML 文档、配置对象)。
-
原型模式(Prototype Pattern)
- 作用:通过复制现有对象来创建新对象,避免重复初始化。
- 应用:Java 中的
clone()方法、对象池管理。
二、结构型模式(7种)
-
适配器模式(Adapter Pattern)
- 作用:将一个类的接口转换成客户端期望的另一种接口,使不兼容的类协同工作。
- 应用:旧代码与新接口的兼容性处理(如 Java 中的
Collection和Iterator)。
-
代理模式(Proxy Pattern)
- 作用:为其他对象提供代理以控制对对象的访问。
- 应用:远程调用(如 RMI)、权限控制(如 Spring AOP)。
-
装饰器模式(Decorator Pattern)
- 作用:动态地为对象添加功能,避免类爆炸问题。
- 应用:Java I/O 流(如
BufferedInputStream装饰FileInputStream)。
-
桥接模式(Bridge Pattern)
- 作用:将抽象部分与其实现部分分离,使它们可以独立变化。
- 应用:图形绘制(如形状与颜色分离)。
-
组合模式(Composite Pattern)
- 作用:将对象组合成树形结构,以表示“部分-整体”的层次结构。
- 应用:文件系统(目录与文件)、GUI 组件树。
-
外观模式(Facade Pattern)
- 作用:为子系统中的一组接口提供统一的高层接口,简化复杂系统的使用。
- 应用:启动服务器时的初始化流程封装。
-
享元模式(Flyweight Pattern)
- 作用:通过共享技术高效地支持大量细粒度对象。
- 应用:文本编辑器中的字符对象共享。
三、行为型模式(11种)
-
观察者模式(Observer Pattern)
- 作用:定义对象间的一对多依赖关系,当一个对象状态变化时,所有依赖者自动更新。
- 应用:事件处理系统(如 Java 的
EventListeners)。
-
策略模式(Strategy Pattern)
- 作用:定义一系列算法,将每个算法封装并使其可互换。
- 应用:支付方式选择(如支付宝、微信支付)。
-
模板方法模式(Template Method Pattern)
- 作用:定义算法骨架,将某些步骤延迟到子类实现。
- 应用:JUnit 测试框架的
setUp()和tearDown()。
-
命令模式(Command Pattern)
- 作用:将请求封装为对象,使请求的发送者与执行者解耦。
- 应用:事务回滚、操作日志记录。
-
状态模式(State Pattern)
- 作用:允许对象在内部状态变化时改变其行为。
- 应用:游戏角色的状态切换(如攻击、防御、逃跑)。TCP的连接状态,例如建立,断开,正在连接。
-
责任链模式(Chain of Responsibility Pattern)
- 作用:将请求的发送者和接收者解耦,多个对象依次处理请求。
- 应用:审批流程(如报销审批)、过滤器链(如 Servlet Filter)。
-
访问者模式(Visitor Pattern)
- 作用:将数据结构与操作分离,对结构中的元素执行操作。
- 应用:编译器的语法树遍历、报表生成。
-
中介者模式(Mediator Pattern)
- 作用:通过中介者对象集中处理多个对象之间的交互。
- 应用:聊天室、GUI 控件的协调。
-
迭代器模式(Iterator Pattern)
- 作用:提供一种顺序访问集合元素的方式,而不暴露其内部结构。
- 应用:Java 中的
Iterator接口。
-
备忘录模式(Memento Pattern)
- 作用:保存对象的内部状态,以便在需要时恢复。
- 应用:撤销/重做功能、游戏存档。
-
解释器模式(Interpreter Pattern)
- 作用:定义语言的文法,并解释语言中的句子。
- 应用:正则表达式解析、简单的计算表达式求值。
四、设计模式的分类总结
| 类别 | 模式数量 | 典型应用场景 |
|---|---|---|
| 创建型模式 | 5 | 对象创建与初始化 |
| 结构型模式 | 7 | 类与对象的组合方式 |
| 行为型模式 | 11 | 对象之间的交互与职责分配 |
五、设计模式的核心原则
- 开闭原则(OCP):对扩展开放,对修改关闭。
- 单一职责原则(SRP):一个类只负责一个职责。
- 里氏替换原则(LSP):子类应能替换父类而不影响程序正确性。
- 依赖倒置原则(DIP):依赖抽象(接口/抽象类),而非具体实现。
- 接口隔离原则(ISP):定义小而专的接口,避免冗余方法。
- 迪米特法则(LoD):减少对象间的直接依赖,保持低耦合。
六、实际应用案例
-
Spring 框架:
- 单例模式:确保
ApplicationContext全局唯一。 - 工厂模式:通过
BeanFactory创建和管理 Bean。 - 代理模式:AOP 实现基于动态代理。
- 单例模式:确保
-
Java 标准库:
- 观察者模式:
java.util.Observer和Observable。 - 装饰器模式:
InputStream和OutputStream的装饰链。
- 观察者模式:
-
设计模式组合使用:
例如,MVC 架构结合了 观察者模式(视图监听模型变化)、策略模式(控制器处理不同请求)、工厂模式(动态创建组件)等。
通过学习和应用这些设计模式,可以显著提升代码的可维护性、可扩展性和可复用性。如果你对某个模式的具体实现或应用场景感兴趣,可以进一步深入探讨!