标签
建造者模式通过将复杂对象的构建过程与表示分离,方便了不同表示产品的创建。它尤其适合需要分步创建复杂对象的场景,使得创建流程更清晰、灵活性更高。然而,随着产品和建造者的增加,可能带来类数量的增多和管理复杂度的上升。
定义
建造者模式是一种创建型设计模式,用于将一个复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。它通常用于构建由多个步骤组成的复杂对象,允许用户按顺序执行这些步骤来定制最终对象。
结构
建造者模式的核心结构包括以下几个部分:
- 产品类(Product):最终要创建的复杂对象,包含多个组成部分。
- 建造者接口(Builder):定义构建产品各部分的接口。
- 具体建造者(Concrete Builder):实现
Builder
接口,定义具体构建步骤并组装成产品对象。
- 指挥者(Director):负责管理建造流程,根据不同的需求,按顺序调用
Builder
的各个构建方法。
类图
在建造者模式的类图中,
Director
通过 Builder
生成一个 Product
。ConcreteBuilder
类实现了具体的构建细节,生成不同的产品。代码实现
假设我们要创建一个复杂的
Computer
对象,其中包含多个组成部分:CPU
、RAM
和 Storage
。1. 产品类
2. 建造者接口
3. 具体建造者
具体建造者实现
Builder
接口,提供构建细节。4. 指挥者类
指挥者类负责管理构建过程,按顺序调用
Builder
的各个构建方法。5. 客户端代码
优点
- 分步创建:建造者模式将复杂对象的构建过程拆分为多个步骤,便于顺序构建。
- 灵活性:相同的构建过程可以用于不同的产品表示。
- 遵循单一职责原则:将复杂对象的构建与其表示分离,独立管理每个组件的创建。
缺点
- 增加类数量:每种产品都需要一个对应的具体建造者类。
- 构建过程依赖于顺序:需要按特定顺序调用方法,可能导致指挥者类较为复杂。
使用场景
- 复杂对象构建:当需要创建包含多个组成部分的复杂对象,且构建过程涉及多个步骤或需要灵活配置时,建造者模式是一种合适的选择。例如,在创建配置灵活的设备(如电脑、汽车)或角色(如游戏角色、NPC)时,建造者模式可实现清晰的配置选项。
- 构建步骤有序:当对象的构建过程有严格的步骤顺序要求(如部分依赖性),建造者模式提供了按特定顺序分步构建的能力,避免遗漏或顺序错误。
- 不同表示的产品:建造者模式适合创建具有相似结构但不同表示的产品。例如,需要创建功能类似但配置不同的对象,通过不同的建造者实现类可生成不同配置的产品。
注意事项
- 构建步骤控制:在复杂的建造流程中,推荐使用
Director
来控制构建步骤的顺序,确保按逻辑顺序执行构建过程。特别是在多步骤构建流程中,Director
能帮助清晰地定义步骤,确保对象的正确构建。
- 代码复杂性:在需求简单或属性少的场景中使用建造者模式可能会显得过于复杂。对于简单对象,可以考虑直接使用构造方法或 Lombok 的
@Builder
注解来避免增加不必要的类。
- 线程安全性:在多线程环境下应用建造者模式时,应注意
Builder
类的线程安全性,特别是当多个线程可能共享同一个建造者实例时,可以考虑使用局部变量或锁来避免并发问题。
- 扩展性与灵活性:为保持代码的可扩展性,确保建造者模式中的
Builder
接口设计灵活,避免过于依赖具体的构建实现。这样,在新增构建需求时,只需添加新的建造者类,而无需修改现有代码。
- 内存与性能:对于频繁创建的对象,建造者模式可能带来额外的内存开销和性能影响。在频繁创建对象的场景中,考虑结合对象池或缓存等优化方法。
扩展
- Lombok 的
@Builder
注解:Lombok 的@Builder
注解是建造者模式的简化实现。它通过自动生成内部静态 Builder 类,允许链式调用配置对象属性并最终通过build()
方法完成对象构建。@Builder
简化了建造者模式的代码量,但适用于属性设置较为简单的情况,不适合复杂流程控制的场景。
@Singular
注解:Lombok 中的@Singular
注解可以与@Builder
一起使用,允许构建列表属性时以单数形式添加元素。例如,如果对象中有集合属性,@Singular
可以逐个添加元素到列表中,避免手动管理集合初始化。
- 流式 API:Java 8 引入的流式 API(Streams)可以结合建造者模式实现数据加工的链式调用。这种方式可以在复杂的数据构建流程中使用流式处理数据,并在末尾通过
build()
构建最终对象。
- 组合建造者:在构建大型对象结构时,可以将建造者模式与组合模式结合,通过构建子部分再组装成完整对象。例如在 GUI 应用中,使用组合模式定义子元素,再通过建造者逐层构建整体界面。