建造者模式是为了控制产品的组装顺序。
问:然而这个顺序可以放在构造类里面,既然如此为什么还需要建造者模式呢?
答:零件生产都放在构造类里面,就太冗余,构造类的参数也会不确定。简而言之,就是创造的对象很复杂,需要建造者模式拆解和封装。
// 生产零件接口
interface ComputerBuild {
void cpu();
void neicun();
void yingpan();
Computer buildComputer();
}
// 生产零件
class ConcreteComputerBuild implements ComputerBuild {
Computer computer;
public ConcreteComputerBuild() {
computer = new Computer();
}
@Override
public void cpu() {
computer.setCpu(new Cpu("intel"));
}
@Override
public void neicun() {
computer.setNeicun(new Neicun("金士顿"));
}
@Override
public void yingpan() {
computer.setYingpan(new Yingpan("500g"));
}
@Override
public Computer buildComputer() {
return computer;
}
}
// 导演控制零件组装顺序
class ComputerDirector {
public Computer constructComputer(ComputerBuild build) {
build.cpu();
build.neicun();
build.yingpan();
return build.buildComputer();
}
}
// 生产的对象
class Computer {
Cpu cpu;
Neicun neicun;
Yingpan yingpan;
public Cpu getCpu() {
return cpu;
}
public void setCpu(Cpu cpu) {
this.cpu = cpu;
}
public Neicun getNeicun() {
return neicun;
}
public void setNeicun(Neicun neicun) {
if (cpu == null)
throw new RuntimeException("cpu还没有装配");
this.neicun = neicun;
}
public Yingpan getYingpan() {
return yingpan;
}
public void setYingpan(Yingpan yingpan) {
if (neicun == null)
throw new RuntimeException("neicun还没有装配");
this.yingpan = yingpan;
}
@Override
public String toString() {
return "Computer{" +
"cpu=" + cpu.name +
", neicun=" + neicun.name +
", yingpan=" + yingpan.name +
'}';
}
}
// 具体的零件
class Cpu {
String name;
public Cpu(String name) {
this.name = name;
}
}
class Neicun {
String name;
public Neicun(String name) {
this.name = name;
}
}
class Yingpan {
String name;
public Yingpan(String name) {
this.name = name;
}
}
main方法如下:
public static void main(String[] args) {
Computer computer = new ComputerDirector().constructComputer(new ConcreteComputerBuild());
System.out.println(computer.toString());
}
Computer{cpu=inter, neicun=金士顿, yingpan=500g}