1. 建造者模式概述
建造者模式(Builder Pattern)是一种创建型设计模式,它允许你分步骤创建复杂对象。这种模式特别适用于那些需要多个步骤或部件组合才能构建完成的复杂对象。与直接实例化对象不同,建造者模式通过将对象的构造过程分离出来,使得相同的构造过程可以创建不同的表示。
我在实际项目中最常用建造者模式的场景是处理具有大量可选参数的复杂对象初始化。比如在开发电商系统时,一个订单对象可能包含20多个属性,其中很多是可选的。如果使用传统的构造函数方式,要么需要编写包含所有参数的庞大构造函数,要么需要提供多个不同参数组合的重载版本,这两种方式都会让代码变得难以维护。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 建造者模式的核心结构
2.1 模式参与者
建造者模式通常包含以下几个关键角色:
-
产品(Product):最终要构建的复杂对象。在订单系统的例子中,就是Order类本身。
-
抽象建造者(Builder):定义了创建产品各个部件的抽象接口,通常包含构建各个部件的方法和一个返回最终产品的方法。
-
具体建造者(Concrete Builder):实现Builder接口,提供各个部件的具体构建和装配方法。不同的Concrete Builder可以创建不同的产品实现。
-
指挥者(Director):负责调用适当的建造者来构建产品,它知道构建过程但不知道具体的构建细节。
2.2 UML类图解析
code复制[Product] ← [Builder]
↑ ↑
[ConcreteProduct] [ConcreteBuilder]
↗
[Director]
这个结构展示了建造者模式的核心关系。Director通过Builder接口与具体建造者交互,而不需要知道具体的构建细节。这种松耦合的设计使得我们可以轻松替换不同的建造者实现。
3. 建造者模式的实现细节
3.1 基础实现示例
让我们通过一个具体的代码示例来理解建造者模式的实现。假设我们要构建一个电脑配置系统:
java复制// 产品类
public class Computer {
private String CPU;
private String RAM;
private String storage;
// 其他属性和getter/setter...
// 私有构造函数,只能通过建造者创建
private Computer(Builder builder) {
this.CPU = builder.CPU;
this.RAM = builder.RAM;
this.storage = builder.storage;
}
// 建造者类
public static class Builder {
private String CPU;
private String RAM;
private String storage;
public Builder setCPU(String CPU) {
this.CPU = CPU;
return this;
}
public Builder setRAM(String RAM) {
this.RAM = RAM;
return this;
}
public Builder setStorage(String storage) {
this.storage = storage;
return this;
}
public Computer build() {
return new Computer(this);
}
}
}
这种实现方式被称为"静态内部类建造者",是Java中实现建造者模式的常见方式。它的优点是:
- 产品类的构造函数可以设为私有,强制通过建造者创建对象
- 建造者与被建造对象紧密结合,维护更方便
- 链式调用使代码更简洁
3.2 变体实现:分步建造者
对于更复杂的对象,我们可以使用分步建造者模式:
java复制public interface ComputerBuilder {
CPUBuilder withCPU();
RAMBuilder withRAM();
StorageBuilder withStorage();
}
public interface CPUBuilder {
RAMBuilder withCPU(String cpu);
}
public interface RAMBuilder {
StorageBuilder withRAM(String ram);
}
public interface StorageBuilder {
FinalBuilder withStorage(String storage);
}
public interface FinalBuilder {
Computer build();
}
public class StandardComputerBuilder implements ComputerBuilder, CPUBuilder, RAMBuilder, StorageBuilder, FinalBuilder {
private Computer computer = new Computer();
@Override
public CPUBuilder withCPU() {
return this;
}
@Override
public RAMBuilder withCPU(String cpu) {
computer.setCPU(cpu);
return this;
}
// 其他接口方法实现...
}
这种分步建造者强制了构建顺序,确保某些部件必须在其他部件之前构建。虽然更复杂,但对于有严格构建顺序要求的场景非常有用。
4. 建造者模式的应用场景
4.1 适合使用建造者模式的场景
-
参数过多的对象创建:当一个类有大量属性,特别是很多可选属性时,建造者模式可以避免"伸缩构造函数"问题。
-
需要不同表现的对象:当需要创建不同表现但构造过程相似的对象时,可以通过不同的具体建造者来实现。
