1.概念
建造者设计模式(Builder Design Pattern)是一种创建型设计模式,它通过将一个复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示。
2.作用
用于简化对复杂对象的创建
3.应用场景
当我们有一个非常复杂的对象(属性很多)需要创建并初始化,传统的创建方法有两种:
使用有参构造器一次完成创建与初始化操作
使用构造器完成创建工作,使用set方法完成初始化操作
但上面两个方法都会有相同的问题——代码量太大,可读性差。
所以这个时候我们可以使用建造者模式。
4.特点
对象的构建过程与表示分离
5.类与对象关系
有以下角色:
- 产品:我们实际要创建和使用的复杂对象
- 抽象建造者:一个用来约束具体建造者的接口
- 具体建造者:实际完成对象的初始化操作
- 指挥者(可选):提供一些默认情况下的初始化配置
6.实现
假设我们现在要创建一个产品——Computer
它包含四个主要部分:CPU、RAM、存储(storage)和GPU。
Computer类(产品)和builder内部类(建造者)
// 产品类:Computer
public class Computer {
private String cpu;
private String ram;
private String storage;
private String gpu;
// 私有构造方法,防止外部直接实例化
private Computer(Builder builder) {
this.cpu = builder.cpu;
this.ram = builder.ram;
this.storage = builder.storage;
this.gpu = builder.gpu;
}
// 内部静态Builder类(建造者)
public static class Builder {
private String cpu;
private String ram;
private String storage;
private String gpu;
// 设置CPU
public Builder setCpu(String cpu) {
this.cpu = cpu;
return this;
}
// 设置RAM
public Builder setRam(String ram) {
this.ram = ram;
return this;
}
// 设置存储
public Builder setStorage(String storage) {
this.storage = storage;
return this;
}
// 设置GPU
public Builder setGpu(String gpu) {
this.gpu = gpu;
return this;
}
// 构建Computer对象
public Computer build() {
return new Computer(this);
}
}
@Override
public String toString() {
return (
"Computer{" +
"cpu='" +
cpu +
'\'' +
", ram='" +
ram +
'\'' +
", storage='" +
storage +
'\'' +
", gpu='" +
gpu +
'\'' +
'}'
);
}
}
该例子中,我们可以看出:
- 我们不能直接为Computer类的属性进行赋值,而是使用builder为其赋值
- 在builder中进行赋值后从builder中取出值传递给Computer类,来完成初始化
- 使用Builder类的各个set方法设置完属性后,使用build方法构建出对象
Director类(指挥者)(可选)
// 指挥者类(可选)
public class ComputerDirector {
private Computer.Builder builder;
public ComputerDirector(Computer.Builder builder) {
this.builder = builder;
}
// 示例构建方法
public Computer constructGamingComputer() {
return builder
.setCpu("Intel i9")
.setRam("32GB")
.setStorage("1TB SSD")
.setGpu("NVIDIA RTX 3080")
.build();
}
// 其他构建方法可以根据需要添加
}
指挥者类在这个例子中不是必须的,这里只是用来提供一些默认配置,让我们能更快的创建并初始化出一个对象
测试类
public class Main {
public static void main(String[] args) {
// 使用Builder直接构建
Computer gamingComputer = new Computer.Builder()
.setCpu("Intel i7")
.setRam("16GB")
.setStorage("512GB SSD")
.setGpu("NVIDIA RTX 3070")
.build();
System.out.println(gamingComputer);
// 使用Director构建(可选)
ComputerDirector director = new ComputerDirector(new Computer.Builder());
Computer highEndComputer = director.constructGamingComputer();
System.out.println(highEndComputer);
}
}
正常使用建造者模式,我们需要使用Builder对象进行赋值,然后最终使用build方法创建对象。
使用指挥者后,因为里面已经有默认配置,所以可以直接创建出对象,更高效。