## Java 23 种设计模式详解### 简介设计模式是软件开发中常见问题的可复用解决方案,它们提供了一种在特定场景下解决问题的模板或指南。学习和应用设计模式可以帮助我们编写出更灵活、可复用和易于维护的代码。Java 中常用的 23 种设计模式可以分为三大类:
创建型模式
:关注对象的创建过程,提供更灵活和可控的对象创建方式。
结构型模式
:关注类和对象的组合,构建更大型、更复杂的结构。
行为型模式
:关注对象之间的交互和职责分配,实现更灵活和高效的算法和行为。### 创建型模式 (Creational Patterns)#### 1. 单例模式 (Singleton Pattern)
定义:
确保一个类只有一个实例,并提供一个全局访问点。
实现方式:
私有化构造函数,提供一个静态方法获取唯一的实例。
应用场景:
需要唯一实例的场景,例如数据库连接池、日志记录器。#### 2. 工厂方法模式 (Factory Method Pattern)
定义:
定义一个创建对象的接口,但由子类决定要实例化的类。
实现方式:
定义一个抽象工厂类,具体工厂子类实现创建具体产品的逻辑。
应用场景:
创建对象需要依赖具体环境或配置的场景。#### 3. 抽象工厂模式 (Abstract Factory Pattern)
定义:
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。
实现方式:
定义一个抽象工厂接口,具体工厂实现创建具体产品族的逻辑。
应用场景:
需要创建多个产品系列,且希望保持产品一致性的场景。#### 4. 建造者模式 (Builder Pattern)
定义:
将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
实现方式:
定义一个构建器类,逐步构建复杂对象的不同部分。
应用场景:
创建复杂对象,且希望将构建过程与表示分离的场景。#### 5. 原型模式 (Prototype Pattern)
定义:
通过复制现有对象来创建新对象,避免重复创建对象的开销。
实现方式:
实现 Cloneable 接口,并重写 clone() 方法。
应用场景:
创建对象成本高昂,且需要创建大量相似对象的场景。### 结构型模式 (Structural Patterns)#### 6. 适配器模式 (Adapter Pattern)
定义:
将一个类的接口转换成客户端希望的另一个接口,使得原本不兼容的类可以一起工作。
实现方式:
定义一个适配器类,实现目标接口,并持有被适配类的实例。
应用场景:
需要复用现有类,但其接口与当前环境不兼容的场景。#### 7. 桥接模式 (Bridge Pattern)
定义:
将抽象部分与其实现部分分离,使它们都可以独立地变化。
实现方式:
定义抽象类和实现类,并通过组合的方式关联。
应用场景:
抽象和实现都需要扩展,且希望避免类爆炸的场景。#### 8. 组合模式 (Composite Pattern)
定义:
将对象组合成树形结构,以表示“部分-整体”的层次结构。
实现方式:
定义一个抽象组件类,包含叶子节点和组合节点的通用方法。
应用场景:
需要处理树形结构数据的场景,例如文件系统、组织架构。#### 9. 装饰器模式 (Decorator Pattern)
定义:
动态地给一个对象添加一些额外的职责,比子类化更灵活。
实现方式:
定义一个装饰器类,包装被装饰对象,并扩展其功能。
应用场景:
需要动态地给对象添加功能的场景,例如 Java IO 流。#### 10. 外观模式 (Facade Pattern)
定义:
为子系统中的一组接口提供一个一致的界面,简化子系统的使用。
实现方式:
定义一个外观类,封装子系统的复杂逻辑。
应用场景:
需要简化复杂子系统的使用,提供更简洁接口的场景。#### 11. 享元模式 (Flyweight Pattern)
定义:
通过共享对象实例来减少对象的创建,降低内存消耗。
实现方式:
将对象的状态分为内部状态和外部状态,共享内部状态不变的对象。
应用场景:
需要创建大量相似对象,且内存消耗成为瓶颈的场景。#### 12. 代理模式 (Proxy Pattern)
定义:
为其他对象提供一种代理以控制对这个对象的访问。
实现方式:
定义一个代理类,实现与目标对象相同的接口,并控制对目标对象的访问。
应用场景:
需要控制对对象的访问,例如延迟加载、权限控制。### 行为型模式 (Behavioral Patterns)#### 13. 责任链模式 (Chain of Responsibility Pattern)
定义:
避免将一个请求的发送者和接收者耦合在一起,让多个对象都有机会处理请求。
实现方式:
定义一个处理器抽象类,每个处理器持有下一个处理器的引用。
应用场景:
有多个对象可以处理请求,且处理顺序不确定的场景。#### 14. 命令模式 (Command Pattern)
定义:
将一个请求封装为一个对象,从而可以用不同的请求参数化客户端,并支持请求的排队、记录和撤销。
实现方式:
定义一个命令接口,每个具体命令实现执行操作的逻辑。
应用场景:
需要将请求参数化、记录或撤销请求的场景。#### 15. 解释器模式 (Interpreter Pattern)
定义:
定义语言的文法,并建立一个解释器来解释该语言中的句子。
实现方式:
定义一个抽象表达式类,每个具体表达式实现解释对应语法规则的逻辑。
应用场景:
需要解释特定语言的场景,例如 SQL 解析、编译器。#### 16. 迭代器模式 (Iterator Pattern)
定义:
提供一种顺序访问聚合对象中各个元素的方法,而无需暴露其内部表示。
实现方式:
定义一个迭代器接口,每个具体迭代器实现遍历集合的逻辑。
应用场景:
需要顺序访问集合元素,且不希望暴露集合内部结构的场景。#### 17. 中介者模式 (Mediator Pattern)
定义:
用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用。
实现方式:
定义一个中介者类,协调各个对象之间的交互。
应用场景:
多个对象之间存在复杂交互,且希望降低耦合度的场景。#### 18. 备忘录模式 (Memento Pattern)
定义:
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后恢复。
实现方式:
定义一个备忘录类,存储对象的内部状态。
应用场景:
需要保存和恢复对象状态的场景,例如撤销操作、游戏存档。#### 19. 观察者模式 (Observer Pattern)
定义:
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。
实现方式:
定义一个主题接口,维护观察者列表,并提供通知方法。
应用场景:
一个对象的状态变化需要通知其他对象的场景,例如事件监听机制。#### 20. 状态模式 (State Pattern)
定义:
允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。
实现方式:
定义一个状态接口,每个具体状态实现对应状态的行为。
应用场景:
对象的行为依赖于其状态,且状态的数量有限的场景。#### 21. 策略模式 (Strategy Pattern)
定义:
定义一系列算法,将每个算法封装起来,并使它们可以互相替换。
实现方式:
定义一个策略接口,每个具体策略实现不同的算法。
应用场景:
需要根据不同情况选择不同算法的场景,例如排序算法、支付方式。#### 22. 模板方法模式 (Template Method Pattern)
定义:
定义一个操作中的算法骨架,将一些步骤延迟到子类中实现。
实现方式:
定义一个抽象类,包含模板方法和基本方法,子类实现具体步骤。
应用场景:
算法结构固定,但部分步骤需要子类实现的场景。#### 23. 访问者模式 (Visitor Pattern)
定义:
表示一个作用于对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
实现方式:
定义一个访问者接口,每个具体访问者实现对不同元素的操作。
应用场景:
需要对集合中的不同类型元素进行不同操作的场景。### 总结以上是 Java 23 种设计模式的详细说明,学习和应用设计模式可以帮助我们编写出更优雅、灵活和易于维护的代码。在实际开发中,我们需要根据具体场景选择合适的模式,并灵活运用各种模式组合来解决问题。
Java 23 种设计模式详解
简介设计模式是软件开发中常见问题的可复用解决方案,它们提供了一种在特定场景下解决问题的模板或指南。学习和应用设计模式可以帮助我们编写出更灵活、可复用和易于维护的代码。Java 中常用的 23 种设计模式可以分为三大类:* **创建型模式**:关注对象的创建过程,提供更灵活和可控的对象创建方式。 * **结构型模式**:关注类和对象的组合,构建更大型、更复杂的结构。 * **行为型模式**:关注对象之间的交互和职责分配,实现更灵活和高效的算法和行为。
创建型模式 (Creational Patterns)
1. 单例模式 (Singleton Pattern)* **定义:** 确保一个类只有一个实例,并提供一个全局访问点。 * **实现方式:** 私有化构造函数,提供一个静态方法获取唯一的实例。 * **应用场景:** 需要唯一实例的场景,例如数据库连接池、日志记录器。
2. 工厂方法模式 (Factory Method Pattern)* **定义:** 定义一个创建对象的接口,但由子类决定要实例化的类。 * **实现方式:** 定义一个抽象工厂类,具体工厂子类实现创建具体产品的逻辑。 * **应用场景:** 创建对象需要依赖具体环境或配置的场景。
3. 抽象工厂模式 (Abstract Factory Pattern)* **定义:** 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。 * **实现方式:** 定义一个抽象工厂接口,具体工厂实现创建具体产品族的逻辑。 * **应用场景:** 需要创建多个产品系列,且希望保持产品一致性的场景。
4. 建造者模式 (Builder Pattern)* **定义:** 将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。 * **实现方式:** 定义一个构建器类,逐步构建复杂对象的不同部分。 * **应用场景:** 创建复杂对象,且希望将构建过程与表示分离的场景。
5. 原型模式 (Prototype Pattern)* **定义:** 通过复制现有对象来创建新对象,避免重复创建对象的开销。 * **实现方式:** 实现 Cloneable 接口,并重写 clone() 方法。 * **应用场景:** 创建对象成本高昂,且需要创建大量相似对象的场景。
结构型模式 (Structural Patterns)
6. 适配器模式 (Adapter Pattern)* **定义:** 将一个类的接口转换成客户端希望的另一个接口,使得原本不兼容的类可以一起工作。 * **实现方式:** 定义一个适配器类,实现目标接口,并持有被适配类的实例。 * **应用场景:** 需要复用现有类,但其接口与当前环境不兼容的场景。
7. 桥接模式 (Bridge Pattern)* **定义:** 将抽象部分与其实现部分分离,使它们都可以独立地变化。 * **实现方式:** 定义抽象类和实现类,并通过组合的方式关联。 * **应用场景:** 抽象和实现都需要扩展,且希望避免类爆炸的场景。
8. 组合模式 (Composite Pattern)* **定义:** 将对象组合成树形结构,以表示“部分-整体”的层次结构。 * **实现方式:** 定义一个抽象组件类,包含叶子节点和组合节点的通用方法。 * **应用场景:** 需要处理树形结构数据的场景,例如文件系统、组织架构。
9. 装饰器模式 (Decorator Pattern)* **定义:** 动态地给一个对象添加一些额外的职责,比子类化更灵活。 * **实现方式:** 定义一个装饰器类,包装被装饰对象,并扩展其功能。 * **应用场景:** 需要动态地给对象添加功能的场景,例如 Java IO 流。
10. 外观模式 (Facade Pattern)* **定义:** 为子系统中的一组接口提供一个一致的界面,简化子系统的使用。 * **实现方式:** 定义一个外观类,封装子系统的复杂逻辑。 * **应用场景:** 需要简化复杂子系统的使用,提供更简洁接口的场景。
11. 享元模式 (Flyweight Pattern)* **定义:** 通过共享对象实例来减少对象的创建,降低内存消耗。 * **实现方式:** 将对象的状态分为内部状态和外部状态,共享内部状态不变的对象。 * **应用场景:** 需要创建大量相似对象,且内存消耗成为瓶颈的场景。
12. 代理模式 (Proxy Pattern)* **定义:** 为其他对象提供一种代理以控制对这个对象的访问。 * **实现方式:** 定义一个代理类,实现与目标对象相同的接口,并控制对目标对象的访问。 * **应用场景:** 需要控制对对象的访问,例如延迟加载、权限控制。
行为型模式 (Behavioral Patterns)
13. 责任链模式 (Chain of Responsibility Pattern)* **定义:** 避免将一个请求的发送者和接收者耦合在一起,让多个对象都有机会处理请求。 * **实现方式:** 定义一个处理器抽象类,每个处理器持有下一个处理器的引用。 * **应用场景:** 有多个对象可以处理请求,且处理顺序不确定的场景。
14. 命令模式 (Command Pattern)* **定义:** 将一个请求封装为一个对象,从而可以用不同的请求参数化客户端,并支持请求的排队、记录和撤销。 * **实现方式:** 定义一个命令接口,每个具体命令实现执行操作的逻辑。 * **应用场景:** 需要将请求参数化、记录或撤销请求的场景。
15. 解释器模式 (Interpreter Pattern)* **定义:** 定义语言的文法,并建立一个解释器来解释该语言中的句子。 * **实现方式:** 定义一个抽象表达式类,每个具体表达式实现解释对应语法规则的逻辑。 * **应用场景:** 需要解释特定语言的场景,例如 SQL 解析、编译器。
16. 迭代器模式 (Iterator Pattern)* **定义:** 提供一种顺序访问聚合对象中各个元素的方法,而无需暴露其内部表示。 * **实现方式:** 定义一个迭代器接口,每个具体迭代器实现遍历集合的逻辑。 * **应用场景:** 需要顺序访问集合元素,且不希望暴露集合内部结构的场景。
17. 中介者模式 (Mediator Pattern)* **定义:** 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用。 * **实现方式:** 定义一个中介者类,协调各个对象之间的交互。 * **应用场景:** 多个对象之间存在复杂交互,且希望降低耦合度的场景。
18. 备忘录模式 (Memento Pattern)* **定义:** 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后恢复。 * **实现方式:** 定义一个备忘录类,存储对象的内部状态。 * **应用场景:** 需要保存和恢复对象状态的场景,例如撤销操作、游戏存档。
19. 观察者模式 (Observer Pattern)* **定义:** 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。 * **实现方式:** 定义一个主题接口,维护观察者列表,并提供通知方法。 * **应用场景:** 一个对象的状态变化需要通知其他对象的场景,例如事件监听机制。
20. 状态模式 (State Pattern)* **定义:** 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。 * **实现方式:** 定义一个状态接口,每个具体状态实现对应状态的行为。 * **应用场景:** 对象的行为依赖于其状态,且状态的数量有限的场景。
21. 策略模式 (Strategy Pattern)* **定义:** 定义一系列算法,将每个算法封装起来,并使它们可以互相替换。 * **实现方式:** 定义一个策略接口,每个具体策略实现不同的算法。 * **应用场景:** 需要根据不同情况选择不同算法的场景,例如排序算法、支付方式。
22. 模板方法模式 (Template Method Pattern)* **定义:** 定义一个操作中的算法骨架,将一些步骤延迟到子类中实现。 * **实现方式:** 定义一个抽象类,包含模板方法和基本方法,子类实现具体步骤。 * **应用场景:** 算法结构固定,但部分步骤需要子类实现的场景。
23. 访问者模式 (Visitor Pattern)* **定义:** 表示一个作用于对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 * **实现方式:** 定义一个访问者接口,每个具体访问者实现对不同元素的操作。 * **应用场景:** 需要对集合中的不同类型元素进行不同操作的场景。
总结以上是 Java 23 种设计模式的详细说明,学习和应用设计模式可以帮助我们编写出更优雅、灵活和易于维护的代码。在实际开发中,我们需要根据具体场景选择合适的模式,并灵活运用各种模式组合来解决问题。