设计模式 4:建造者模式
定义与目的
- 定义 :建造者模式将一个复杂对象的
构建
与其表示
分离,使得同样的构建过程
可以创建不同的表示
。 - 目的 :该模式主要用于创建复杂对象时,这些对象的创建过程可能涉及多个步骤,并且可能需要不同的配置选项。建造者模式将
构建过程
与表示
分离,使得可以构建出不同配置的同一类型对象。
实现示例
假设我们要创建一个计算机对象,这个对象有很多配置选项,比如处理器、内存、硬盘等。我们可以使用建造者模式来创建不同配置的计算机实例。
java
// 定义产品类 - 计算机
public class Computer {
// 计算机的处理器型号
private String processor;
// 计算机的内存大小(单位:GB)
private int ram;
// 计算机的硬盘大小(单位:GB)
private int hardDrive;
// 私有构造函数,仅允许通过 Builder 创建 Computer 实例
// 参数 builder 用于从 Builder 类中获取处理器、内存和硬盘的信息
private Computer(Builder builder) {
this.processor = builder.processor;
this.ram = builder.ram;
this.hardDrive = builder.hardDrive;
}
// Builder 类,用于构建 Computer 实例
public static class Builder {
// 计算机的处理器型号
private String processor;
// 计算机的内存大小(单位:GB)
private int ram;
// 计算机的硬盘大小(单位:GB)
private int hardDrive;
// 设置处理器型号
// 参数 processor 为处理器型号
// 返回当前 Builder 实例,以便可以继续链式调用其他方法
public Builder processor(String processor) {
this.processor = processor;
return this;
}
// 设置内存大小
// 参数 ram 为内存大小(单位:GB)
// 返回当前 Builder 实例,以便可以继续链式调用其他方法
public Builder ram(int ram) {
this.ram = ram;
return this;
}
// 设置硬盘大小
// 参数 hardDrive 为硬盘大小(单位:GB)
// 返回当前 Builder 实例,以便可以继续链式调用其他方法
public Builder hardDrive(int hardDrive) {
this.hardDrive = hardDrive;
return this;
}
// 构建 Computer 实例
// 返回使用当前 Builder 实例创建的 Computer 实例
public Computer build() {
return new Computer(this);
}
}
// Getter 方法,用于获取处理器型号
public String getProcessor() {
return processor;
}
// Getter 方法,用于获取内存大小
public int getRam() {
return ram;
}
// Getter 方法,用于获取硬盘大小
public int getHardDrive() {
return hardDrive;
}
// 重写 toString 方法,用于格式化输出 Computer 实例的信息
@Override
public String toString() {
return "Computer{" +
"processor='" + processor + '\'' +
", ram=" + ram +
", hardDrive=" + hardDrive +
'}';
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
// 创建一台配置较高的计算机
Computer computerHighEnd = new Computer.Builder()
.processor("i9") // 设置处理器型号为 i9
.ram(32) // 设置内存大小为 32 GB
.hardDrive(1024) // 设置硬盘大小为 1024 GB
.build(); // 构建 Computer 实例
// 创建一台配置较低的计算机
Computer computerLowEnd = new Computer.Builder()
.processor("i3") // 设置处理器型号为 i3
.ram(4) // 设置内存大小为 4 GB
.hardDrive(128) // 设置硬盘大小为 128 GB
.build(); // 构建 Computer 实例
// 输出高配置计算机的信息
System.out.println(computerHighEnd); // 输出: Computer{processor='i9', ram=32, hardDrive=1024}
// 输出低配置计算机的信息
System.out.println(computerLowEnd); // 输出: Computer{processor='i3', ram=4, hardDrive=128}
}
}
使用场景
- 当你需要创建一个复杂对象,且该对象的构建过程需要分步骤进行时。
- 当构建对象的不同配置需要不同的步骤时。
- 当构建对象的步骤可能会发生变化时。
建造者模式通过将构建过程与表示分离,使得可以在不同的情况下使用相同的构建步骤来创建不同的对象配置。这对于创建复杂对象时非常有用,特别是在对象的构建过程需要多个步骤的情况下。
小结
建造者模式适用于创建具有多个可选部分的复杂对象。它提供了一种方式来逐步构建这些对象,同时保持代码的简洁性和可扩展性。