我们这里就不说定义了,定义太抽象,说了也不一定能明白,我自己其实也记不住,我就直接说说我个人的理解,用白话文来表述
打个比方,你要盖一栋房子,你得找个会盖房子的人来,它就是建造者,但是盖一栋什么样的房子呢,那就由你自己决定,比如,我要盖一栋3层高的房子,好,它就给你盖3层高,你说我不要电梯,只要楼梯,那就只有楼梯,你说房顶要尖的,那就是尖的,你说窗户要是圆形的,那窗户就圆形的
适用场景
- 对象内部组成过于复杂(属性较多)
- 同样的调用创建不同的对象
看代码,我们用电脑做示例
/**
* 建造者模式:链式调用
*/
public class Computer {
private String computerName;
private String computerCpu;
private String cpmputerMemory;
public Computer(ComputerBuilder computerBuilder){
this.computerName = computerBuilder.computerName;
this.computerCpu = computerBuilder.computerCpu;
this.cpmputerMemory = computerBuilder.cpmputerMemory;
}
@Override
public String toString() {
return "Computer{" +
"computerName='" + computerName + '\'' +
", computerCpu='" + computerCpu + '\'' +
", cpmputerMemory='" + cpmputerMemory + '\'' +
'}';
}
//静态内部类
public static class ComputerBuilder{
private String computerName;
private String computerCpu;
private String cpmputerMemory;
public ComputerBuilder builderComputerName(String computerName){
this.computerName = computerName;
return this;
}
public ComputerBuilder builderComputerCpu(String computerCpu){
this.computerCpu = computerCpu;
return this;
}
public ComputerBuilder builderComputerMemory(String computerMemory){
this.cpmputerMemory = computerMemory;
return this;
}
public Computer builder(){
return new Computer(this);
}
}
}
解读一下代码,我们创建了一个Computer电脑类,这个类中还有一个ComputerBuilder的静态内部类,然后在ComputerBuilder类中写了几个对应属性的builderXXXX方法,在方法中对属性进行赋值,这些方法返回的就是ComputerBuilder本身,这也是可以链式调用的关键,最后有一个builder方法,这个方法返回的是Computer,里面new了一个Computer对象,往构造方法中传递自己
看看测试代码
public class Test {
public static void main(String[] args) {
Computer computer = new Computer.ComputerBuilder()
.builderComputerName("华为电脑")
.builderComputerCpu("I7")
.builderComputerMemory("16G")
.builder();
System.out.println(computer);
}
}
很眼熟吧,这就是链式调用了,建造者模式这种链式调用的方式,在Java中用的很多,这里的Computer只负责创建电脑,至于是什么电脑,由我们自己决定,你想要什么电脑,它就给你建造一个什么电脑出来
其实建造者模式跟工厂模式很类似,但不同的是,工厂模式创建出来的对象都是一样的,另外,你想要其它不同的电脑,就得创建不同的工厂来实现,而建造者模式不一样,想要什么你自己可以定义的,比如电脑中还包含了声卡,但是,你可以建造出没有声卡的电脑
但是建造者的缺点和抽象工厂很像,就是在内部新增需求的时候,就需要改动代码了,比如你这电脑本身没有人脸ID,但是你想加上这么一个属性或者功能,就要修改Computer这个类了,至于改动的成本大还是小,得根据具体的业务来砍了