创建型模式-建造者模式
建造者模式是一种创建型设计模式,它通过将对象的构建过程拆分为多个步骤,并允许按照特定顺序逐步构建复杂对象。建造者模式的核心思想是将对象的构建与表示分离,以便相同的构建过程可以创建不同的表示。
建造者模式的主要特点
-
产品类(
Product
):表示要构建的复杂对象。产品类通常具有多个属性,需要通过建造者来逐步构建。
-
建造者接口(
Builder
):定义了构建复杂对象的方法。建造者接口通常包含设置产品属性的方法,以及构建产品的方法。
-
具体建造者(
Concrete Builder
):实现了建造者接口,负责实际构建复杂对象。具体建造者类中通常包含一个产品对象,通过调用设置属性的方法来构建产品。
-
指挥者(
Director
):负责使用建造者对象构建复杂对象。指挥者类通常包含一个建造者对象,通过调用建造者的方法来构建产品。
建造者模式的工作流程
- 客户端创建指挥者对象,并传入具体的建造者对象。
- 指挥者通过调用建造者对象的方法,按照一定的顺序来构建复杂对象。
- 建造者对象根据指挥者的调用,逐步设置产品的属性,并最终构建出复杂对象。
- 客户端通过指挥者获取构建完成的产品对象。
建造者模式的优点
- 分离构建过程和表示,使得同样的构建过程可以创建不同的表示。
- 可以更加精细地控制产品的构建过程,灵活性高。
- 隐藏产品的构建细节,使得客户端不需要知道具体的构建过程。
- 客户端创建指挥者对象和具体建造者对象。
- 指挥者根据具体建造者的实现调用其方法来构建产品。
建造者模式适用场景
- 当创建复杂对象的构建过程较为复杂,需要进行多个步骤的操作时,可以使用建造者模式。
- 当创建的对象具有多个属性,且不同的属性可以灵活组合时,可以使用建造者模式。
- 当希望创建不同表示的对象,但是构建过程相同或相似时,可以使用建造者模式。
需要注意的是,建造者模式适用于创建复杂对象的场景,特别是当对象的构建过程比较复杂或涉及多个步骤时。如果对象的构建过程比较简单,可以考虑使用工厂模式。
建造者模式示例
建造者模式示例,以创建一份电脑对象为例
// 产品类
class Computer {
private String cpu;
private String memory;
private String storage;
public void setCpu(String cpu) {
this.cpu = cpu;
}
public void setMemory(String memory) {
this.memory = memory;
}
public void setStorage(String storage) {
this.storage = storage;
}
public String getDetails() {
return "Computer - CPU: " + cpu + ", Memory: " + memory + ", Storage: " + storage;
}
}
// 抽象建造者
interface ComputerBuilder {
void setCPU();
void setMemory();
void setStorage();
Computer getComputer();
}
// 具体建造者
class BasicComputerBuilder implements ComputerBuilder {
private Computer computer;
public BasicComputerBuilder() {
computer = new Computer();
}
public void setCPU() {
computer.setCpu("Intel Core i3");
}
public void setMemory() {
computer.setMemory("4GB");
}
public void setStorage() {
computer.setStorage("500GB HDD");
}
public Computer getComputer() {
return computer;
}
}
class HighEndComputerBuilder implements ComputerBuilder {
private Computer computer;
public HighEndComputerBuilder() {
computer = new Computer();
}
public void setCPU() {
computer.setCpu("Intel Core i7");
}
public void setMemory() {
computer.setMemory("16GB");
}
public void setStorage() {
computer.setStorage("1TB SSD");
}
public Computer getComputer() {
return computer;
}
}
// 指挥者
class Director {
public void constructBasicComputer(ComputerBuilder builder) {
builder.setCPU();
builder.setMemory();
builder.setStorage();
}
public void constructHighEndComputer(ComputerBuilder builder) {
builder.setCPU();
builder.setMemory();
builder.setStorage();
}
}
// 客户端
public class Main {
public static void main(String[] args) {
Director director = new Director();
// 构建基础配置的电脑
ComputerBuilder basicBuilder = new BasicComputerBuilder();
director.constructBasicComputer(basicBuilder);
Computer basicComputer = basicBuilder.getComputer();
System.out.println(basicComputer.getDetails());
// 构建高端配置的电脑
ComputerBuilder highEndBuilder = new HighEndComputerBuilder();
director.constructHighEndComputer(highEndBuilder);
Computer highEndComputer = highEndBuilder.getComputer();
System.out.println(highEndComputer.getDetails());
}
}
在上述示例中,我们使用建造者模式来构建不同配置的电脑对象。
Computer
类是产品类,包含了电脑的属性和方法。
ComputerBuilder
是抽象建造者接口,定义了设置电脑各部件的抽象方法和返回最终电脑对象的方法。
BasicComputerBuilder
和 HighEndComputerBuilder
是具体建造者类,实现了抽象建造者接口,负责实际构建电脑对象的过程。Director
是指挥者类,负责调用具体建造者的方法来构建电脑对象。客户端通过指挥者调用具体建造者的方法来构建不同配置的电脑对象。
在客户端 Main
类中,我们创建了指挥者对象和具体建造者对象,并通过指挥者调用具体建造者的方法来构建不同配置的电脑对象。然后,我们可以使用电脑对象的方法来获取电脑的详细信息。
通过建造者模式,我们可以使用相同的构建过程来创建不同配置的电脑对象,而无需直接实例化具体的产品类,使得构建过程更加灵活和可复用。