文章目录
- 什么是建造者模式?
- 建造者模式通常涉及以下几个角色
-
- 产品(Product):
- 抽象建造者(Builder):
- [具体建造者(Concrete Builder):](#具体建造者(Concrete Builder):)
- 指导者(Director):
- 客户端(Client):
- 建造者模式适用于以下场景
- 代码示例
什么是建造者模式?
建造者模式是一种创建型设计模式,它可以将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。它允许客户端通过指定需要创建的对象类型和配置选项来构建对象,而无需知道具体的构建细节。
使用建造者模式的主要目的是将对象的构建过程封装在一个独立的建造者类中,使得构建过程可以灵活地组合,而不需要对客户端暴露具体的构建细节。这样可以提高代码的可读性、可维护性和可扩展性。
建造者模式通常涉及以下几个角色
产品(Product):
表示要构建的复杂对象。通常包含多个属性,其构建过程由具体的建造者来完成。
抽象建造者(Builder):
定义了构建产品的抽象方法,以及设置产品属性的方法。不同的具体建造者可以实现不同的构建算法,以及根据需要设置不同的产品属性。
具体建造者(Concrete Builder):
实现了抽象建造者的方法,完成具体的产品构建和属性设置。
指导者(Director):
负责调用建造者的方法来构建产品。它通常包含一个构建方法,用于指导建造过程的顺序和逻辑。
客户端(Client):
创建指导者对象,并通过指导者来构建产品。
建造者模式适用于以下场景
- 当需要创建复杂对象时,且对象的构建过程需要独立于其表示时,可以使用建造者模式。例如,当 构建一个具有多个组件的电脑时,每个组件的构建过程可能不同,但最终的电脑表示是一样的。
- 当需要使用相同的构建过程创建不同的表示时,可以使用建造者模式。例如,使用相同的构建过程可以创建不同类型的飞机,只需在具体建造者中设置不同的属性。
- 当需要将构建过程和表示分离,以便能够灵活地组合不同的构建过程和表示时,可以使用建造者模式。例如,可以通过组合不同的建造者和产品来构建复杂的对象。
代码示例
下面是一个实现的建造者模式示例,以创建一个电脑为例:
java
// 产品类:电脑
class Computer {
private String cpu;
private String memory;
private String hardDrive;
// 设置cpu
public void setCpu(String cpu) {
this.cpu = cpu;
}
// 设置内存
public void setMemory(String memory) {
this.memory = memory;
}
// 设置硬盘
public void setHardDrive(String hardDrive) {
this.hardDrive = hardDrive;
}
// 显示电脑配置
public void showConfiguration() {
System.out.println("Computer Configuration:");
System.out.println("CPU: " + cpu);
System.out.println("Memory: " + memory);
System.out.println("HardDrive: " + hardDrive);
}
}
// 抽象建造者
interface ComputerBuilder {
void buildCpu();
void buildMemory();
void buildHardDrive();
Computer getComputer();
}
// 具体建造者:台式机建造者
class DesktopBuilder implements ComputerBuilder {
private Computer computer;
public DesktopBuilder() {
computer = new Computer();
}
@Override
public void buildCpu() {
computer.setCpu("Intel Core i7");
}
@Override
public void buildMemory() {
computer.setMemory("16GB DDR4");
}
@Override
public void buildHardDrive() {
computer.setHardDrive("1TB SSD");
}
@Override
public Computer getComputer() {
return computer;
}
}
// 具体建造者:笔记本建造者
class LaptopBuilder implements ComputerBuilder {
private Computer computer;
public LaptopBuilder() {
computer = new Computer();
}
@Override
public void buildCpu() {
computer.setCpu("Intel Core i5");
}
@Override
public void buildMemory() {
computer.setMemory("8GB DDR4");
}
@Override
public void buildHardDrive() {
computer.setHardDrive("512GB SSD");
}
@Override
public Computer getComputer() {
return computer;
}
}
// 指导者:电脑商店
class ComputerStore {
private ComputerBuilder computerBuilder;
public void setComputerBuilder(ComputerBuilder computerBuilder) {
this.computerBuilder = computerBuilder;
}
public Computer getComputer() {
computerBuilder.buildCpu();
computerBuilder.buildMemory();
computerBuilder.buildHardDrive();
return computerBuilder.getComputer();
}
}
// 客户端代码
public class Main {
public static void main(String[] args) {
ComputerStore computerStore = new ComputerStore();
// 构建台式机
ComputerBuilder desktopBuilder = new DesktopBuilder();
computerStore.setComputerBuilder(desktopBuilder);
Computer desktopComputer = computerStore.getComputer();
desktopComputer.showConfiguration();
// 构建笔记本
ComputerBuilder laptopBuilder = new LaptopBuilder();
computerStore.setComputerBuilder(laptopBuilder);
Computer laptopComputer = computerStore.getComputer();
laptopComputer.showConfiguration();
}
}
在上面的示例中,Computer是要构建的产品,它包含了cpu、内存和硬盘等属性。ComputerBuilder是抽象建造者,定义了构建产品的抽象方法和获取产品的方法。DesktopBuilder和LaptopBuilder是具体建造者,它们分别实现了抽象建造者的方法,完成了具体的产品构建和属性设置。ComputerStore是指导者,负责调用建造者的方法来构建产品。
客户端代码中,首先创建一个ComputerStore对象,并设置相应的建造者。然后,通过调用getComputer方法来获取构建完成的产品,并进行展示。
通过使用建造者模式,客户端可以通过指定需要创建的对象类型和配置选项来构建对象,而无需知道具体的构建细节。建造者模式将复杂对象的构建过程与其表示分离,使得构建过程可以灵活地组合,提高了代码的可读性、可维护性和可扩展性。