前言
建造者模式,重点肯定是放在建造两字上,目的也就是建造一个对象,理解他的使用场景,往往比学会他的使用方法更重要。
一台电脑是如何生产出来的?首先工厂要有一个装电脑的机器或人(总而言之就是对象),然后他们要有一个人来指挥,如果没人来指挥,全听客户要求,很容易乱套。最后客户要提供自己需求,不然就是开盲盒买电脑(虽然提供了也是…)。综上,我们可以知道,当一个对象特别复杂的时候,比如电脑,他有很多组件,我们就可以使用建造者模式进行骚操作。
首先我们要确定产品,产品是具体的
public class Computer {
private String cpu;//客户自定义
private String ram;//客户自定义
private String keyBoard;//商家提供
public String getCpu() {
return cpu;
}
public Computer setCpu(String cpu) {
this.cpu = cpu;
return this;
}
public String getRam() {
return ram;
}
public Computer setRam(String ram) {
this.ram = ram;
return this;
}
public String getKeyBoard() {
return keyBoard;
}
public Computer setKeyBoard(String keyBoard) {
this.keyBoard = keyBoard;
return this;
}
}
生产电脑的,不管是人还是机器,统一称为电脑制造者,他们手上肯定有一个正在组装的电脑,就跟搬砖的一定会接触到砖是一个道理。
public abstract class ComputerBuilder {
public abstract ComputerBuilder setPcCpu();
public abstract ComputerBuilder setPcRam();
public abstract ComputerBuilder setKeyBoard();
public abstract Computer getComputer();
}
他们肯定有人在指挥,指挥者要知道指挥谁,然后指挥他装电脑的步骤,先装CPU,还是先装内存条。
public class ComputerDirector {
public static void makeComputer(ComputerBuilder computerBuilder){
computerBuilder.setPcRam().setPcCpu().setKeyBoard();
}
}
工厂要清楚是什么工厂,然后工厂需要知道客户需求
public class MacComputerBuilder extends ComputerBuilder {
private String cpu;//客户需求
private String ram;//客户需求
private Computer computer;//商家的电脑
public MacComputerBuilder(String cpu,String ram) {
computer=new Computer();
//客户提供需求
this.cpu=cpu;
this.ram=ram;
}
@Override
public ComputerBuilder setPcCpu() {
this.getComputer().setCpu(cpu);
return this;
}
@Override
public ComputerBuilder setPcRam() {
this.getComputer().setRam(ram);
return this;
}
@Override
public ComputerBuilder setKeyBoard() {
//商家提供
this.getComputer().setKeyBoard("苹果键盘");
return this;
}
@Override
public Computer getComputer() {
return computer;
}
}
客户测试
public class Main {
public static void main(String[] args){
MacComputerBuilder macComputerBuilder=new MacComputerBuilder("英特尔","金士顿");
ComputerDirector.makeComputer(macComputerBuilder);
Computer computer=macComputerBuilder.getComputer();
System.out.println(computer.getCpu());
System.out.println(computer.getKeyBoard());
System.out.println(computer.getRam());
}
}