适用场景:
一个对象有多个子对象构成,我们要建这个对象的时候,需要很多步骤,构建多个子对象,然后再由子对象构成一个对象,我们就可以考虑用建造者模式
建造者本质:
让建造子对象的builder和装配对象director解耦,从而建造出复杂的对象
举个例子:
我们来构建一个电脑对象,它有鼠标,显示器,键盘等子对象构成,我们如何来装配这个对呢
/**
* 电脑实体类
*
* @author liuxg
* @date 2016年5月24日 下午8:37:58
*/
public class Computer {
private Monitor monitor;
private Keyboard keyboard;
private Mouse mouse;
public Monitor getMonitor() {
return monitor;
}
public void setMonitor(Monitor monitor) {
this.monitor = monitor;
}
public Keyboard getKeyboard() {
return keyboard;
}
public void setKeyboard(Keyboard keyboard) {
this.keyboard = keyboard;
}
public Mouse getMouse() {
return mouse;
}
public void setMouse(Mouse mouse) {
this.mouse = mouse;
}
}
class Monitor {
public void deviceName() {
System.out.println("显示器");
}
}
class Keyboard {
public void deviceName() {
System.out.println("键盘");
}
}
class Mouse {
public void deviceName() {
System.out.println("鼠标");
}
}
接下来我们来创建一个构建子对象的builder来构建子对象
/**
* 电脑建造器
* @author liuxg
* @date 2016年5月24日 下午8:40:12
*/
public interface ComputerBuilder {
Monitor buildMonitor();
Keyboard buildKeyboard();
Mouse buildMouse();
}
/**
* 电脑建造起的实现类
* @author liuxg
* @date 2016年5月24日 下午8:40:48
*/
public class ComputerBuilderImpl implements ComputerBuilder{
@Override
public Monitor buildMonitor() {
return new Monitor();
}
@Override
public Keyboard buildKeyboard() {
return new Keyboard();
}
@Override
public Mouse buildMouse() {
return new Mouse();
}
}
然后我们再定义一个类,专门用来专配电脑,这样子就实现构建者和组装者的解耦和分离
/**
* 装配器
* @author liuxg
* @date 2016年5月24日 下午8:42:18
*/
public class Dirctor {
public static Computer getCompute(ComputerBuilder builder){
Computer computer = new Computer();
computer.setKeyboard(builder.buildKeyboard());
computer.setMonitor(builder.buildMonitor());
computer.setMouse(builder.buildMouse());
return computer;
}
}
我们来使用客户端测试一下
public class Client01 {
public static void main(String[] args) {
ComputerBuilder builder = new ComputerBuilderImpl();
Computer computer = Dirctor.getCompute(builder);
computer.getKeyboard().deviceName();
computer.getMonitor().deviceName();
computer.getMouse().deviceName();
}
}