设计模式是软件工程中一套被反复使用、经过分类编目的代码设计经验。本文将从“是什么”“为什么”“怎么分”三个维度,带你快速建立对Java 23种经典设计模式的整体认知。
一、什么是设计模式?
设计模式(Design Pattern)是对在特定场景下、解决重复出现的软件设计问题的通用、可复用的解决方案。它并非可以直接拷贝的代码或库,而更像一份经验模板——描述了问题、解决方案及其后果,帮助开发者做出更灵活、可维护的设计。
类比:如同建筑领域的“梁、柱、拱门”等构造范式,设计模式是软件架构的“半成品”蓝图。
1994年,四位作者(Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides)合著的《设计模式:可复用面向对象软件的基础》一书,首次系统性地总结了23种模式,因此被称为 GoF(Gang of Four,四人组)设计模式,这也是Java领域最经典的版本。
二、设计模式的作用是什么?
正确运用设计模式能带来以下核心价值:
作用 | 说明 |
|---|
提高代码复用性 | 模式提供通用的设计结构,避免重复造轮子。 |
增强可维护性 | 符合设计原则(如开闭原则)的模式,使代码更易读、易修、易扩展。 |
促进团队沟通 | 模式名称(如“工厂方法”“观察者”)成为开发人员之间的共享词汇,降低沟通成本。 |
降低系统耦合 | 合理使用模式可减少模块间的硬依赖,提升系统的弹性与可测试性。 |
规避反模式 | 借鉴前人经验,避免常见但错误的设计方式(即反模式)。 |
⚠️ 注意:设计模式并非万能。滥用或在不合适的场景强行套用,会增加不必要的复杂度。应结合具体问题,优先考虑简洁性。
三、设计模式的大分类与小分类
GoF将23种设计模式按目的(即模式用来完成什么工作) 分为三大类:创建型、结构型、行为型。下面分别介绍每大类及其包含的具体模式(小分类)。
🏗️ 1. 创建型模式(Creational Patterns)
关注对象创建的过程,将对象的创建与使用分离,使系统不依赖于对象如何被创建、组合和表示。
模式名称 | 简要说明 |
|---|
单例模式(Singleton) | 确保一个类只有一个实例,并提供全局访问点。 |
工厂方法模式(Factory Method) | 定义创建对象的接口,但由子类决定实例化哪一个类。 |
抽象工厂模式(Abstract Factory) | 创建一系列相关或相互依赖的对象族,无需指定具体类。 |
建造者模式(Builder) | 将复杂对象的构建与表示分离,允许通过相同的构建过程创建不同的表示。 |
原型模式(Prototype) | 通过拷贝现有实例(原型)来创建新对象,避免昂贵的构造过程。 |
🔗 2. 结构型模式(Structural Patterns)
关注如何将类或对象组合成更大的结构,在保证结构灵活、高效的同时,实现新的功能。
模式名称 | 简要说明 |
|---|
适配器模式(Adapter) | 将一个类的接口转换成客户期望的另一个接口,使不兼容的类可以一起工作。 |
装饰器模式(Decorator) | 动态地为对象附加额外职责,是继承的一种灵活替代。 |
代理模式(Proxy) | 为其他对象提供一种代理,以控制对该对象的访问(如延迟加载、访问控制)。 |
外观模式(Facade) | 为子系统中的一组接口提供一个统一的高层接口,简化使用。 |
桥接模式(Bridge) | 将抽象部分与实现部分分离,使它们都可以独立地变化。 |
组合模式(Composite) | 将对象组合成树形结构以表示“部分-整体”的层次结构,使客户对单个对象和组合对象的使用具有一致性。 |
享元模式(Flyweight) | 利用共享技术高效支持大量细粒度对象,减少内存占用。 |
🎭 3. 行为型模式(Behavioral Patterns)
关注对象之间的通信和职责分配,描述算法与对象间交互的模式,使行为更灵活、更容易复用。
模式名称 | 简要说明 |
|---|
观察者模式(Observer) | 定义对象间的一对多依赖,当一个对象状态改变时,所有依赖者自动得到通知并更新。 |
策略模式(Strategy) | 定义一组算法族,分别封装起来,使它们可以互相替换,算法的变化独立于使用算法的客户。 |
模板方法模式(Template Method) | 在父类中定义算法的骨架,将一些步骤延迟到子类中实现,不改变算法结构即可重定义某些步骤。 |
命令模式(Command) | 将请求封装为对象,从而使用不同的请求、队列或日志来参数化其他对象,并支持可撤销操作。 |
责任链模式(Chain of Responsibility) | 为多个对象处理同一请求的机会,请求沿着链传递,直到某个对象处理它。 |
状态模式(State) | 允许一个对象在其内部状态改变时改变其行为,看起来就像修改了它的类。 |
迭代器模式(Iterator) | 提供一种方法顺序访问聚合对象中的各个元素,而不暴露其内部表示。 |
访问者模式(Visitor) | 表示一个作用于某对象结构中的各元素的操作,使你在不改变各元素类的前提下定义作用于这些元素的新操作。 |
中介者模式(Mediator) | 用一个中介对象来封装一组对象之间的交互,使各对象不需要显式地相互引用。 |
备忘录模式(Memento) | 在不破坏封装的前提下,捕获并外部化一个对象的内部状态,以便之后恢复该对象。 |
解释器模式(Interpreter) | 给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。 |
📌 总结
掌握设计模式不仅是Java进阶的必修课,更是写出优雅、健壮代码的基石。建议从单例、工厂、策略、观察者等高频模式入手,结合实际代码练习,逐步内化到日常开发中。