建造者模式是一种创建型设计模式
,旨在将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。它适用于以下场景:
- 当对象的创建过程非常复杂,包含多个步骤或参数时。
- 当需要创建的对象具有多个组成部分,且这些部分的组合方式可能不同时。
- 当希望创建过程与对象的具体表示解耦时。
核心思想
建造者模式通过以下方式实现对象的创建:
- 将复杂对象的
构建过程分解
为多个步骤:每个步骤负责构建对象的一部分。 - 引入一个
建造者类
(Builder):负责定义构建步骤的接口,并实现具体的构建逻辑。 - 引入一个
指挥者类
(Director):负责控制构建过程的顺序,但不涉及具体的构建细节。 最终产品
(Product):通过建造者模式构建的复杂对象。
通过这种方式,建造者模式将对象的构建过程与对象本身解耦,使得构建过程更加灵活和可扩展。
建造者模式的结构
建造者模式通常包含以下角色:
- 产品(Product)
最终要构建的复杂对象通,常包含多个组成部分。 - 抽象建造者(Builder)
定义构建产品的各个步骤的接口。通常包含多个方法,每个方法负责构建产品的一个部分。 - 具体建造者(Concrete Builder)
实现抽象建造者接口,提供具体的构建逻辑。负责创建和组装产品的各个部分。 - 指挥者(Director)
负责控制构建过程的顺序。调用建造者的方法,按照特定顺序构建产品。 - 客户端(Client)
创建指挥者和建造者对象,并通过指挥者构建最终产品。
建造者模式的优点
分离构建过程与表示
建造者模式将对象的构建过程与对象本身分离,使得构建过程更加灵活。易于扩展
可以通过添加新的具体建造者来支持新的产品类型,而无需修改现有代码。更好的控制构建过程
指挥者类可以精确控制构建过程的顺序和步骤。代码复用性高
相同的构建过程可以用于创建不同的产品。
建造者模式的缺点
增加了代码复杂性
需要定义多个类(建造者、指挥者等),增加了系统的复杂性。适用于复杂对象
如果对象构建过程非常简单,使用建造者模式可能会显得冗余。
建造者模式的应用场景
构建复杂对象
例如,构建一个包含多个组成部分的电脑、汽车或房屋。构建过程需要分步骤进行
例如,生成一个包含多个步骤的文档或报告。需要构建多个不同的表示
例如,构建不同配置的电脑(游戏电脑、办公电脑等)。
建造者模式实现示例
以下是一个简单的建造者模式实现示例,假设我们要构建一个复杂的“电脑”对象,电脑由 CPU、内存、硬盘和显卡等部分组成。
(1)产品类(Product)
public class Computer {
private String cpu;
private String memory;
private String hardDisk;
private String gpu;
// Setters and Getters
public void setCpu(String cpu) { this.cpu = cpu; }
public void setMemory(String memory) { this.memory = memory; }
public void setHardDisk(String hardDisk) { this.hardDisk = hardDisk; }
public void setGpu(String gpu) { this.gpu = gpu; }
@Override
public String toString() {
return "Computer [cpu=" + cpu + ", memory=" + memory + ", hardDisk=" + hardDisk + ", gpu=" + gpu + "]";
}
}
(2)抽象建造者类(Builder)
public interface ComputerBuilder {
void buildCpu();
void buildMemory();
void buildHardDisk();
void buildGpu();
Computer getResult();
}
(3)具体建造者类(Concrete Builder)
public class GamingComputerBuilder implements ComputerBuilder {
private Computer computer;
public GamingComputerBuilder() {
this.computer = new Computer();
}
@Override
public void buildCpu() {
computer.setCpu("Intel i9");
}
@Override
public void buildMemory() {
computer.setMemory("32GB DDR5");
}
@Override
public void buildHardDisk() {
computer.setHardDisk("1TB SSD");
}
@Override
public void buildGpu() {
computer.setGpu("NVIDIA RTX 4090");
}
@Override
public Computer getResult() {
return computer;
}
}
(4)指挥者类(Director)
public class ComputerDirector {
private ComputerBuilder builder;
public ComputerDirector(ComputerBuilder builder) {
this.builder = builder;
}
public void construct() {
builder.buildCpu();
builder.buildMemory();
builder.buildHardDisk();
builder.buildGpu();
}
}
(5)客户端代码(Client)
public class Client {
public static void main(String[] args) {
// 创建具体建造者
ComputerBuilder builder = new GamingComputerBuilder();
// 创建指挥者
ComputerDirector director = new ComputerDirector(builder);
// 构建产品
director.construct();
// 获取最终产品
Computer computer = builder.getResult();
System.out.println(computer);
}
}
建造者模式与工厂模式的区别
工厂模式
:关注对象的创建,但不关心对象的构建过程。
建造者模式
:关注对象的构建过程,特别是复杂对象的构建。
通过建造者模式,可以更好地管理和控制复杂对象的构建过程,使代码更加清晰和可维护。