编程设计模式是解决软件设计中常见问题的经典解决方案,GoF(Gang of Four)提出的 23种设计模式 被广泛应用于实际开发中。以下是这些设计模式的分类和简要说明:


一、创建型模式(5种)

  1. 单例模式(Singleton Pattern)

    • 作用:确保一个类只有一个实例,并提供全局访问点。
    • 应用:数据库连接池、Spring框架中的 ApplicationContext 等。
  2. 工厂方法模式(Factory Method Pattern)

    • 作用:定义一个创建对象的接口,由子类决定实例化哪个类。
    • 应用:Spring框架的 BeanFactory、日志框架(如 Log4j)的工厂类。
  3. 抽象工厂模式(Abstract Factory Pattern)

    • 作用:提供一个创建一系列相关或相互依赖对象的接口,无需指定具体类。
    • 应用:跨平台 UI 工具包(如 Windows 和 macOS 的按钮、文本框)。
  4. 建造者模式(Builder Pattern)

    • 作用:将一个复杂对象的构建过程与其表示分离,逐步构建对象。
    • 应用:构建复杂对象(如生成 HTML 文档、配置对象)。
  5. 原型模式(Prototype Pattern)

    • 作用:通过复制现有对象来创建新对象,避免重复初始化。
    • 应用:Java 中的 clone() 方法、对象池管理。

二、结构型模式(7种)

  1. 适配器模式(Adapter Pattern)

    • 作用:将一个类的接口转换成客户端期望的另一种接口,使不兼容的类协同工作。
    • 应用:旧代码与新接口的兼容性处理(如 Java 中的 CollectionIterator)。
  2. 代理模式(Proxy Pattern)

    • 作用:为其他对象提供代理以控制对对象的访问。
    • 应用:远程调用(如 RMI)、权限控制(如 Spring AOP)。
  3. 装饰器模式(Decorator Pattern)

    • 作用:动态地为对象添加功能,避免类爆炸问题。
    • 应用:Java I/O 流(如 BufferedInputStream 装饰 FileInputStream)。
  4. 桥接模式(Bridge Pattern)

    • 作用:将抽象部分与其实现部分分离,使它们可以独立变化。
    • 应用:图形绘制(如形状与颜色分离)。
  5. 组合模式(Composite Pattern)

    • 作用:将对象组合成树形结构,以表示“部分-整体”的层次结构。
    • 应用:文件系统(目录与文件)、GUI 组件树。
  6. 外观模式(Facade Pattern)

    • 作用:为子系统中的一组接口提供统一的高层接口,简化复杂系统的使用。
    • 应用:启动服务器时的初始化流程封装。
  7. 享元模式(Flyweight Pattern)

    • 作用:通过共享技术高效地支持大量细粒度对象。
    • 应用:文本编辑器中的字符对象共享。

三、行为型模式(11种)

  1. 观察者模式(Observer Pattern)

    • 作用:定义对象间的一对多依赖关系,当一个对象状态变化时,所有依赖者自动更新。
    • 应用:事件处理系统(如 Java 的 EventListeners)。
  2. 策略模式(Strategy Pattern)

    • 作用:定义一系列算法,将每个算法封装并使其可互换。
    • 应用:支付方式选择(如支付宝、微信支付)。
  3. 模板方法模式(Template Method Pattern)

    • 作用:定义算法骨架,将某些步骤延迟到子类实现。
    • 应用:JUnit 测试框架的 setUp()tearDown()
  4. 命令模式(Command Pattern)

    • 作用:将请求封装为对象,使请求的发送者与执行者解耦。
    • 应用:事务回滚、操作日志记录。
  5. 状态模式(State Pattern)

    • 作用:允许对象在内部状态变化时改变其行为。
    • 应用:游戏角色的状态切换(如攻击、防御、逃跑)。TCP的连接状态,例如建立,断开,正在连接。
  6. 责任链模式(Chain of Responsibility Pattern)

    • 作用:将请求的发送者和接收者解耦,多个对象依次处理请求。
    • 应用:审批流程(如报销审批)、过滤器链(如 Servlet Filter)。
  7. 访问者模式(Visitor Pattern)

    • 作用:将数据结构与操作分离,对结构中的元素执行操作。
    • 应用:编译器的语法树遍历、报表生成。
  8. 中介者模式(Mediator Pattern)

    • 作用:通过中介者对象集中处理多个对象之间的交互。
    • 应用:聊天室、GUI 控件的协调。
  9. 迭代器模式(Iterator Pattern)

    • 作用:提供一种顺序访问集合元素的方式,而不暴露其内部结构。
    • 应用:Java 中的 Iterator 接口。
  10. 备忘录模式(Memento Pattern)

    • 作用:保存对象的内部状态,以便在需要时恢复。
    • 应用:撤销/重做功能、游戏存档。
  11. 解释器模式(Interpreter Pattern)

    • 作用:定义语言的文法,并解释语言中的句子。
    • 应用:正则表达式解析、简单的计算表达式求值。

四、设计模式的分类总结

类别 模式数量 典型应用场景
创建型模式 5 对象创建与初始化
结构型模式 7 类与对象的组合方式
行为型模式 11 对象之间的交互与职责分配

五、设计模式的核心原则

  1. 开闭原则(OCP):对扩展开放,对修改关闭。
  2. 单一职责原则(SRP):一个类只负责一个职责。
  3. 里氏替换原则(LSP):子类应能替换父类而不影响程序正确性。
  4. 依赖倒置原则(DIP):依赖抽象(接口/抽象类),而非具体实现。
  5. 接口隔离原则(ISP):定义小而专的接口,避免冗余方法。
  6. 迪米特法则(LoD):减少对象间的直接依赖,保持低耦合。

六、实际应用案例

  • Spring 框架

    • 单例模式:确保 ApplicationContext 全局唯一。
    • 工厂模式:通过 BeanFactory 创建和管理 Bean。
    • 代理模式:AOP 实现基于动态代理。
  • Java 标准库

    • 观察者模式java.util.ObserverObservable
    • 装饰器模式InputStreamOutputStream 的装饰链。
  • 设计模式组合使用
    例如,MVC 架构结合了 观察者模式(视图监听模型变化)、策略模式(控制器处理不同请求)、工厂模式(动态创建组件)等。


通过学习和应用这些设计模式,可以显著提升代码的可维护性、可扩展性和可复用性。如果你对某个模式的具体实现或应用场景感兴趣,可以进一步深入探讨!