建造者模式(Builder Pattern)
建造者模式是一种创建型设计模式,用于构建复杂对象。该模式的主要目标是将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
通常情况下,一个对象的构建过程涉及多个步骤,而且这些步骤的实现可能因需求的不同而变化。建造者模式通过将构建过程拆分成多个步骤,并提供一个指导者(Director)来协调这些步骤的顺序,从而实现了构建过程的灵活性和可复用性。
建造者模式的主要参与者包括:
- 产品(Product): 被构建的复杂对象。建造者模式的目标是创建这个对象。
- 抽象建造者(Builder): 声明了构建产品的抽象接口,包括定义了构建产品各个部分的抽象方法。
- 具体建造者(ConcreteBuilder): 实现了抽象建造者接口,负责实际构建产品的各个部分,并提供一个用于获取最终产品的方法。
- 指导者(Director): 负责协调具体建造者的构建过程,按照一定的步骤和顺序来构建产品。
- 客户端(Client): 使用建造者模式来构建复杂对象的客户端代码。
案例说明
以生产电脑为例来演示建造者模式的实现。在下面例子中,我们将电脑抽象为一个复杂对象,它包含了处理器、内存、存储等组件。
首先,定义产品(Computer):
代码语言:java复制public class Computer {
private String processor;
private String memory;
private String storage;
public void setProcessor(String processor) {
this.processor = processor;
}
public void setMemory(String memory) {
this.memory = memory;
}
public void setStorage(String storage) {
this.storage = storage;
}
@Override
public String toString() {
return "Computer{"
"processor='" processor '''
", memory='" memory '''
", storage='" storage '''
'}';
}
}
接下来,定义抽象建造者接口(ComputerBuilder):
代码语言:java复制public interface ComputerBuilder {
void buildProcessor();
void buildMemory();
void buildStorage();
Computer getResult();
}
然后,创建具体建造者实现类(DesktopComputerBuilder、LaptopComputerBuilder):
代码语言:java复制public class DesktopComputerBuilder implements ComputerBuilder {
private Computer computer = new Computer();
@Override
public void buildProcessor() {
computer.setProcessor("Desktop Processor");
}
@Override
public void buildMemory() {
computer.setMemory("Desktop Memory");
}
@Override
public void buildStorage() {
computer.setStorage("Desktop Storage");
}
@Override
public Computer getResult() {
return computer;
}
}
代码语言:java复制public class LaptopComputerBuilder implements ComputerBuilder {
private Computer computer = new Computer();
@Override
public void buildProcessor() {
computer.setProcessor("Laptop Processor");
}
@Override
public void buildMemory() {
computer.setMemory("Laptop Memory");
}
@Override
public void buildStorage() {
computer.setStorage("Laptop Storage");
}
@Override
public Computer getResult() {
return computer;
}
}
最后,定义指导者(ComputerDirector):
代码语言:java复制public class ComputerDirector {
private ComputerBuilder computerBuilder;
public ComputerDirector(ComputerBuilder computerBuilder) {
this.computerBuilder = computerBuilder;
}
public void constructComputer() {
computerBuilder.buildProcessor();
computerBuilder.buildMemory();
computerBuilder.buildStorage();
}
public Computer getComputer() {
return computerBuilder.getResult();
}
}
现在,客户端可以使用建造者模式来构建不同类型的电脑:
代码语言:java复制public class Client {
public static void main(String[] args) {
ComputerBuilder desktopBuilder = new DesktopComputerBuilder();
ComputerBuilder laptopBuilder = new LaptopComputerBuilder();
ComputerDirector director1 = new ComputerDirector(desktopBuilder);
director1.constructComputer();
Computer desktop = director1.getComputer();
System.out.println("Desktop Computer: " desktop);
ComputerDirector director2 = new ComputerDirector(laptopBuilder);
director2.constructComputer();
Computer laptop = director2.getComputer();
System.out.println("Laptop Computer: " laptop);
}
}
这个例子中,通过建造者模式,我们可以根据需要构建不同类型的电脑,而且构建的过程可以在不同的指导者下灵活变化。
案例说明
在上面的案例中,我们通过建造者模式构建了两种不同类型的电脑:Desktop Computer和Laptop Computer。下面详细说明了构建过程:
- 定义产品(Computer):Computer 类包含了电脑的属性,如处理器(processor)、内存(memory)和存储(storage)。
- 定义抽象建造者接口(ComputerBuilder):ComputerBuilder 接口定义了构建电脑的抽象方法,包括构建处理器、内存和存储的方法,以及获取最终产品的方法。
- 创建具体建造者实现类:DesktopComputerBuilder 和 LaptopComputerBuilder 类实现了 ComputerBuilder 接口,负责实际构建不同类型电脑的各个部分。在具体建造者的 buildProcessor、buildMemory、buildStorage 方法中,设置了相应类型电脑的处理器、内存和存储属性。
- 定义指导者(ComputerDirector):ComputerDirector 类负责协调具体建造者的构建过程,按照一定的步骤和顺序来构建电脑。constructComputer 方法调用了建造者的构建方法,设置了处理器、内存和存储等属性。getComputer 方法用于获取构建完成的电脑产品。
- 客户端使用建造者模式构建不同类型的电脑:在客户端中,首先创建了两个具体建造者实例,分别是 DesktopComputerBuilder 和 LaptopComputerBuilder。然后,通过 ComputerDirector 来构建不同类型的电脑:director1 构建了台式电脑,它的构建过程包括设置台式电脑的处理器、内存和存储。director2 构建了笔记本电脑,它的构建过程包括设置笔记本电脑的处理器、内存和存储。最后,通过 director1.getComputer() 和 director2.getComputer() 获取构建完成的台式电脑和笔记本电脑。
总的来说,通过建造者模式,我们能够通过不同的具体建造者实现类来构建不同类型的电脑,而且在构建过程中,可以通过指导者来控制构建的步骤和顺序,实现了构建过程的灵活性和可复用性。这种模式使得客户端代码与具体产品的构建过程解耦,使得系统更易维护和扩展。
我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!