建造者模式
00 分钟
2024-11-13
标签
💡
建造者模式通过将复杂对象的构建过程与表示分离,方便了不同表示产品的创建。它尤其适合需要分步创建复杂对象的场景,使得创建流程更清晰、灵活性更高。然而,随着产品和建造者的增加,可能带来类数量的增多和管理复杂度的上升。

定义

建造者模式是一种创建型设计模式,用于将一个复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。它通常用于构建由多个步骤组成的复杂对象,允许用户按顺序执行这些步骤来定制最终对象。

结构

建造者模式的核心结构包括以下几个部分:
  • 产品类(Product):最终要创建的复杂对象,包含多个组成部分。
  • 建造者接口(Builder):定义构建产品各部分的接口。
  • 具体建造者(Concrete Builder):实现 Builder 接口,定义具体构建步骤并组装成产品对象。
  • 指挥者(Director):负责管理建造流程,根据不同的需求,按顺序调用 Builder 的各个构建方法。

类图

在建造者模式的类图中,Director 通过 Builder 生成一个 ProductConcreteBuilder 类实现了具体的构建细节,生成不同的产品。

代码实现

假设我们要创建一个复杂的 Computer 对象,其中包含多个组成部分:CPURAMStorage

1. 产品类

2. 建造者接口

3. 具体建造者

具体建造者实现 Builder 接口,提供构建细节。

4. 指挥者类

指挥者类负责管理构建过程,按顺序调用 Builder 的各个构建方法。

5. 客户端代码


优点

  1. 分步创建:建造者模式将复杂对象的构建过程拆分为多个步骤,便于顺序构建。
  1. 灵活性:相同的构建过程可以用于不同的产品表示。
  1. 遵循单一职责原则:将复杂对象的构建与其表示分离,独立管理每个组件的创建。

缺点

  1. 增加类数量:每种产品都需要一个对应的具体建造者类。
  1. 构建过程依赖于顺序:需要按特定顺序调用方法,可能导致指挥者类较为复杂。

使用场景

  1. 复杂对象构建:当需要创建包含多个组成部分的复杂对象,且构建过程涉及多个步骤或需要灵活配置时,建造者模式是一种合适的选择。例如,在创建配置灵活的设备(如电脑、汽车)或角色(如游戏角色、NPC)时,建造者模式可实现清晰的配置选项。
  1. 构建步骤有序:当对象的构建过程有严格的步骤顺序要求(如部分依赖性),建造者模式提供了按特定顺序分步构建的能力,避免遗漏或顺序错误。
  1. 不同表示的产品:建造者模式适合创建具有相似结构但不同表示的产品。例如,需要创建功能类似但配置不同的对象,通过不同的建造者实现类可生成不同配置的产品。

注意事项

  1. 构建步骤控制:在复杂的建造流程中,推荐使用 Director 来控制构建步骤的顺序,确保按逻辑顺序执行构建过程。特别是在多步骤构建流程中,Director 能帮助清晰地定义步骤,确保对象的正确构建。
  1. 代码复杂性:在需求简单或属性少的场景中使用建造者模式可能会显得过于复杂。对于简单对象,可以考虑直接使用构造方法或 Lombok 的 @Builder 注解来避免增加不必要的类。
  1. 线程安全性:在多线程环境下应用建造者模式时,应注意 Builder 类的线程安全性,特别是当多个线程可能共享同一个建造者实例时,可以考虑使用局部变量或锁来避免并发问题。
  1. 扩展性与灵活性:为保持代码的可扩展性,确保建造者模式中的 Builder 接口设计灵活,避免过于依赖具体的构建实现。这样,在新增构建需求时,只需添加新的建造者类,而无需修改现有代码。
  1. 内存与性能:对于频繁创建的对象,建造者模式可能带来额外的内存开销和性能影响。在频繁创建对象的场景中,考虑结合对象池或缓存等优化方法。

扩展

  1. Lombok 的 @Builder 注解:Lombok 的 @Builder 注解是建造者模式的简化实现。它通过自动生成内部静态 Builder 类,允许链式调用配置对象属性并最终通过 build() 方法完成对象构建。@Builder 简化了建造者模式的代码量,但适用于属性设置较为简单的情况,不适合复杂流程控制的场景。
  1. @Singular 注解:Lombok 中的 @Singular 注解可以与 @Builder 一起使用,允许构建列表属性时以单数形式添加元素。例如,如果对象中有集合属性,@Singular 可以逐个添加元素到列表中,避免手动管理集合初始化。
  1. 流式 API:Java 8 引入的流式 API(Streams)可以结合建造者模式实现数据加工的链式调用。这种方式可以在复杂的数据构建流程中使用流式处理数据,并在末尾通过 build() 构建最终对象。
  1. 组合建造者:在构建大型对象结构时,可以将建造者模式与组合模式结合,通过构建子部分再组装成完整对象。例如在 GUI 应用中,使用组合模式定义子元素,再通过建造者逐层构建整体界面。
 
上一篇
很鸡儿扯的报错
下一篇
说明

评论
Loading...