建造者模式(Builder Pattern)
1. 概述
建造者模式是一种创建型设计模式,它通过将一个复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示。这个模式主要用于创建一些复杂的对象,这些对象的创建过程通常涉及多个步骤。
2. 适用场景
- 需要生成的对象具有复杂的内部结构,构建步骤复杂。
- 想要通过不同的配置方式构造不同的对象表示(例如同一个对象在不同场景下有不同的配置)。
- 需要创建的对象的属性较多,且有不同的组合方式。
3. 结构
- Builder(建造者接口):定义了构建复杂对象的各个步骤的接口。
- ConcreteBuilder(具体建造者):实现Builder接口,构建并组装各个部件。
- Product(产品类):表示最终构建的复杂对象。
- Director(指挥者):负责按照特定顺序或规则构建产品对象,使用Builder接口来完成构建。
4. 示例代码
假设我们要构建一个复杂的电脑(Computer)对象,该对象包含多个部件(如CPU、内存、存储等),我们可以使用建造者模式来构建不同配置的电脑。
1. 定义产品类
class Computer {
private String CPU;
private String RAM;
private String storage;
private String GPU;
// 提供给Builder类使用的构造方法
private Computer(Builder builder) {
this.CPU = builder.CPU;
this.RAM = builder.RAM;
this.storage = builder.storage;
this.GPU = builder.GPU;
}
@Override
public String toString() {
return "Computer [CPU=" + CPU + ", RAM=" + RAM + ", storage=" + storage + ", GPU=" + GPU + "]";
}
// 静态内部类 Builder
public static class Builder {
private String CPU;
private String RAM;
private String storage;
private String GPU;
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 Builder setGPU(String GPU) {
this.GPU = GPU;
return this;
}
public Computer build() {
return new Computer(this);
}
}
}
2. 使用Builder构建不同的Computer对象
public class BuilderPatternDemo {
public static void main(String[] args) {
// 构建高性能电脑
Computer highEndComputer = new Computer.Builder()
.setCPU("Intel i9")
.setRAM("32GB")
.setStorage("1TB SSD")
.setGPU("NVIDIA RTX 3080")
.build();
// 构建普通电脑
Computer midRangeComputer = new Computer.Builder()
.setCPU("Intel i5")
.setRAM("16GB")
.setStorage("512GB SSD")
.setGPU("NVIDIA GTX 1660")
.build();
// 输出电脑配置
System.out.println("High-end Computer: " + highEndComputer);
System.out.println("Mid-range Computer: " + midRangeComputer);
}
}
3. 运行结果
High-end Computer: Computer [CPU=Intel i9, RAM=32GB, storage=1TB SSD, GPU=NVIDIA RTX 3080]
Mid-range Computer: Computer [CPU=Intel i5, RAM=16GB, storage=512GB SSD, GPU=NVIDIA GTX 1660]
4. 分析
- 分步构造:建造者模式将复杂对象的创建过程分解为多个步骤,用户可以按需调用不同的构造方法,以得到不同的对象。
- 链式调用:通过在
Builder
类的方法中返回this
,可以实现链式调用,简化代码。 - 不变性:
Computer
类的字段在对象创建后无法更改,保证了对象的不可变性,提高了安全性。
5. 优缺点
-
优点:
- 易于扩展:可以很容易地添加新的构建步骤或不同的产品配置,而不会影响现有代码。
- 清晰的构建过程:将复杂对象的构建过程分解为多个步骤,使代码更加清晰易懂。
- 支持链式调用:可以通过链式调用简化代码,提高代码的可读性。
-
缺点:
- 对象创建过程复杂:如果对象非常简单,使用建造者模式可能会增加不必要的复杂性。
- 更多的类:需要额外定义
Builder
类,增加了类的数量。