1. 简介
- 场景:
- 我们要建造一个复杂的产品。比如:电脑、手机。这个复杂的产品创建有这样一个问题需要处理
- 装配这些子组件是不是有个步骤问题?
- 我们要建造一个复杂的产品。比如:电脑、手机。这个复杂的产品创建有这样一个问题需要处理
- 建造模式的本质:
- 分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。
- 由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象。相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦,实现了更好的复用。
2. 代码实现
计算机及组件
/**
* 计算机类
*/
public class Computer {
private Screen screen;// 显示屏
private Host host;// 主机
private Keyboard keyboard;// 键盘
public Screen getScreen() {
return screen;
}
public void setScreen(Screen screen) {
this.screen = screen;
}
public Host getHost() {
return host;
}
public void setHost(Host host) {
this.host = host;
}
public Keyboard getKeyboard() {
return keyboard;
}
public void setKeyboard(Keyboard keyboard) {
this.keyboard = keyboard;
}
@Override
public String toString() {
return "Computer [screen=" + screen + ", host=" + host + ", keyboard=" + keyboard + "]";
}
}
/**
* 显示屏
*/
class Screen {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Screen(String name) {
super();
this.name = name;
}
@Override
public String toString() {
return "Screen [name=" + name + "]";
}
}
/**
* 主机
*/
class Host {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Host(String name) {
super();
this.name = name;
}
@Override
public String toString() {
return "Host [name=" + name + "]";
}
}
/**
* 键盘
*/
class Keyboard {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Keyboard(String name) {
super();
this.name = name;
}
@Override
public String toString() {
return "Keyboard [name=" + name + "]";
}
}
建造者接口及实现
/**
* computer建造者接口
*/
public interface ComputerBuilder {
Host builderHost();
Keyboard builderKeyboard();
Screen builderScreen();
}
/**
* Csdn牌computer建造者
*/
public class CsdnComputerBuilder implements ComputerBuilder {
@Override
public Host builderHost() {
System.out.println("构建Csdn牌主机");
return new Host("Csdn牌主机");
}
@Override
public Keyboard builderKeyboard() {
System.out.println("构建Csdn牌键盘");
return new Keyboard("Csdn牌键盘");
}
@Override
public Screen builderScreen() {
System.out.println("构建Csdn牌显示屏");
return new Screen("Csdn牌显示屏");
}
}
装配者接口及实现
/**
* computer组装接口
*/
public interface ComputerDirector {
/**
* 组装computer对象
*/
Computer directorComputer();
}
/**
* CSDN牌computer装配类
*/
public class CsdnComputerDirector implements ComputerDirector {
private ComputerBuilder builder;
public CsdnComputerDirector(ComputerBuilder builder) {
super();
this.builder = builder;
}
@Override
public Computer directorComputer() {
Host host = builder.builderHost();// 建造主机
Keyboard keyboard = builder.builderKeyboard();// 建造键盘
Screen screen = builder.builderScreen();// 建造显示屏
Computer computer = new Computer();
computer.setHost(host);// 装配主机
computer.setKeyboard(keyboard);// 装配键盘
computer.setScreen(screen);// 装配显示屏
return computer;
}
}
测试
public class Client {// 调用者
public static void main(String[] args) {
// 创建装配者对象
ComputerDirector director = new CsdnComputerDirector(new CsdnComputerBuilder());
// 装配computer
Computer computer = director.directorComputer();
System.out.println(computer);
}
}
控制台打印
构建Csdn牌主机
构建Csdn牌键盘
构建Csdn牌显示屏
Computer [screen=Screen [name=Csdn牌显示屏], host=Host [name=Csdn牌主机], keyboard=Keyboard [name=Csdn牌键盘]]
适用于对象的构建非常复杂的场景