题目
介绍下建造者模式
答案
建造者模式(Builder Pattern)是一种 创建型设计模式,用于构建一个复杂对象的各个部分,并允许使用相同的构建过程创建不同的表示(或版本)对象。
建造者模式的特点:
- **将对象的构建过程与表示分离**
- 适合对象内部结构复杂、参数较多或构建步骤较多的场景。
- 通常包含以下几个角色:
- **Product(产品类)**:复杂对象,将被构建的对象。
- **Builder(抽象建造者)**:定义构建产品的各个部件的抽象。
- **ConcreteBuilder(具体建造者)**:实现 Builder 接口,具体构建各个部件。
- **Director(指挥者)**:调用建造者的方法来完成复杂对象的创建。
代码示例:建造一台电脑
```java
// 产品类
public class Computer {
private String CPU;
private String GPU;
private String memory;
private String storage;
public void setCPU(String CPU) { this.CPU = CPU; }
public void setGPU(String GPU) { this.GPU = GPU; }
public void setMemory(String memory) { this.memory = memory; }
public void setStorage(String storage) { this.storage = storage; }
@Override
public String toString() {
return "Computer{" +
"CPU='" + CPU + '\'' +
", GPU='" + GPU + '\'' +
", Memory='" + memory + '\'' +
", Storage='" + storage + '\'' +
'}';
}
}
// 抽象建造者
public interface ComputerBuilder {
void buildCPU();
void buildGPU();
void buildMemory();
void buildStorage();
Computer getComputer();
}
// 具体建造者
public class GamingComputerBuilder implements ComputerBuilder {
private Computer computer = new Computer();
public void buildCPU() {
computer.setCPU("Intel i9");
}
public void buildGPU() {
computer.setGPU("NVIDIA RTX 4090");
}
public void buildMemory() {
computer.setMemory("32GB DDR5");
}
public void buildStorage() {
computer.setStorage("1TB NVMe SSD");
}
public Computer getComputer() {
return computer;
}
}
// 指挥者
public class Director {
private ComputerBuilder builder;
public Director(ComputerBuilder builder) {
this.builder = builder;
}
public void constructComputer() {
builder.buildCPU();
builder.buildGPU();
builder.buildMemory();
builder.buildStorage();
}
public Computer getComputer() {
return builder.getComputer();
}
}
// 测试
public class Main {
public static void main(String[] args) {
ComputerBuilder builder = new GamingComputerBuilder();
Director director = new Director(builder);
director.constructComputer();
Computer computer = director.getComputer();
System.out.println(computer);
}
}
```
使用场景
- 当一个对象的构建过程非常复杂时(如多个步骤、顺序要求等)。
- 当一个类的构造函数有很多参数,尤其是可选参数时。
