建造者模式(Builder Pattern):复杂对象的分步构建艺术
建造者模式(又称生成器模式)是创建型设计模式的一种,核心思想是将复杂对象的构建过程与表示分离,使得同样的构建流程可以生成不同的产品表示。这种模式特别适合处理由多个部件组成、构建步骤复杂的对象(如汽车、文档、配置项等)。
建造者模式的核心结构
![构建器模式]()
建造者模式通过四个核心角色实现复杂对象的构建,分工明确且各司其职:
产品(Product)
- 定义被构建的复杂对象,包含多个组成部件(如汽车的发动机、底盘、车身等)。
- 示例:
Computer(包含 CPU、内存、硬盘等部件)。
建造者接口(Builder)
- 声明构建产品各个部件的抽象方法(如
buildCPU()、buildMemory()),以及返回最终产品的方法(如getResult())。
- 作用:规范构建流程,确保所有具体建造者遵循统一的步骤。
具体建造者(ConcreteBuilder)
- 实现建造者接口,具体实现每个部件的构建逻辑,并负责将部件组装成产品。
- 示例:
GameComputerBuilder(构建游戏电脑,侧重高性能 CPU 和显卡)、OfficeComputerBuilder(构建办公电脑,侧重稳定性)。
指导者(Director)
- 负责控制构建流程,调用建造者接口的方法按顺序构建产品,不直接参与部件的具体构建。
- 作用:隔离客户端与构建过程,确保构建步骤的一致性。
代码实现示例
以 “自定义电脑组装” 为例,展示建造者模式的具体应用:
产品(Computer)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public class Computer { private String cpu; private String memory; private String硬盘; private String graphicsCard;
public void setCpu(String cpu) { this.cpu = cpu; } public void setMemory(String memory) { this.memory = memory; } public void set硬盘(String 硬盘) { this.硬盘 = 硬盘; } public void setGraphicsCard(String graphicsCard) { this.graphicsCard = graphicsCard; }
@Override public String toString() { return "Computer{" + "cpu='" + cpu + '\'' + ", memory='" + memory + '\'' + ", 硬盘='" + 硬盘 + '\'' + ", graphicsCard='" + graphicsCard + '\'' + '}'; } }
|
建造者接口(ComputerBuilder)
1 2 3 4 5 6 7 8
| public interface ComputerBuilder { void buildCpu(); void buildMemory(); void build硬盘(); void buildGraphicsCard(); Computer getResult(); }
|
具体建造者(游戏电脑和办公电脑)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| public class GameComputerBuilder implements ComputerBuilder { private Computer computer = new Computer();
@Override public void buildCpu() { computer.setCpu("Intel i9"); }
@Override public void buildMemory() { computer.setMemory("32GB DDR5"); }
@Override public void build硬盘() { computer.set硬盘("1TB SSD"); }
@Override public void buildGraphicsCard() { computer.setGraphicsCard("RTX 4090"); }
@Override public Computer getResult() { return computer; } }
public class OfficeComputerBuilder implements ComputerBuilder { private Computer computer = new Computer();
@Override public void buildCpu() { computer.setCpu("Intel i5"); }
@Override public void buildMemory() { computer.setMemory("16GB DDR4"); }
@Override public void build硬盘() { computer.set硬盘("512GB SSD"); }
@Override public void buildGraphicsCard() { computer.setGraphicsCard("集成显卡"); }
@Override public Computer getResult() { return computer; } }
|
指导者(Director)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public class ComputerDirector { private ComputerBuilder builder;
public ComputerDirector(ComputerBuilder builder) { this.builder = builder; }
public Computer construct() { builder.buildCpu(); builder.buildMemory(); builder.build硬盘(); builder.buildGraphicsCard(); return builder.getResult(); } }
|
客户端使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public class BuilderDemo { public static void main(String[] args) { ComputerBuilder gameBuilder = new GameComputerBuilder(); ComputerDirector gameDirector = new ComputerDirector(gameBuilder); Computer gamePC = gameDirector.construct(); System.out.println("游戏电脑配置:" + gamePC);
ComputerBuilder officeBuilder = new OfficeComputerBuilder(); ComputerDirector officeDirector = new ComputerDirector(officeBuilder); Computer officePC = officeDirector.construct(); System.out.println("办公电脑配置:" + officePC); } }
|
输出结果
1 2
| 游戏电脑配置:Computer{cpu='Intel i9', memory='32GB DDR5', 硬盘='1TB SSD', graphicsCard='RTX 4090'} 办公电脑配置:Computer{cpu='Intel i5', memory='16GB DDR4', 硬盘='512GB SSD', graphicsCard='集成显卡'}
|
建造者模式的核心优势
- 分离构建与表示
构建过程(由 Director 控制)与产品的具体部件(由 ConcreteBuilder 实现)分离,客户端无需知道产品的内部组成细节。
- 灵活支持不同表示
更换具体建造者(如从GameComputerBuilder换为OfficeComputerBuilder),即可在相同构建流程下生成不同产品,扩展性极强。
- 精确控制构建步骤
指导者(Director)定义了固定的构建步骤(如先 CPU 后内存),确保产品构建的规范性,避免部件组装顺序错误。
- 封装复杂创建逻辑
将多个部件的创建逻辑分散到具体建造者中,每个建造者专注于一种产品的构建,符合单一职责原则。
适用场景
- 复杂对象构建:当产品由多个部件组成,且部件之间有依赖关系或构建顺序要求时(如汽车、电脑、文档)。
- 多版本产品:需要同一构建流程生成不同配置的产品(如不同配置的手机、不同风格的报表)。
- 避免 telescoping 构造函数:当类的构造函数参数过多且可选参数多(如 10 + 参数)时,用建造者模式替代冗长的构造函数,提高代码可读性。
与工厂模式的区别
| 维度 |
建造者模式 |
工厂模式(如抽象工厂) |
| 核心目标 |
分步构建复杂对象,关注 “如何组装” |
快速创建产品,关注 “创建什么” |
| 产品复杂度 |
处理多部件组成的复杂对象 |
处理单一或简单关联的产品 |
| 构建过程可见性 |
暴露构建步骤(由 Director 控制) |
隐藏构建过程,直接返回产品 |
| 典型应用 |
电脑、汽车等组装产品 |
数据库连接、简单工具类 |
总结
建造者模式通过 “建造者接口 + 具体建造者 + 指导者” 的组合,完美解决了复杂对象的构建问题。它将构建流程与产品表示分离,既保证了构建的灵活性,又确保了步骤的规范性,特别适合需要多版本、多部件产品的场景。在实际开发中,当遇到 “对象构造参数多且复杂” 或 “需要多种配置的同类产品” 时,建造者模式是优于工厂模式的选择