定义:将一个复杂对象的构建与表示分离,使同样的构建过程可以创建不同的表示。也就是将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程可以生产出不同的内部表象的产品对象。
比如,我们熟知的“鱼香肉丝”这道菜(内部复杂的产品),参照菜谱上的制作流程(构建过程一样),10个厨师可能会做出不同味道的“鱼香肉丝”。
建造者模式的角色定义,在建造者模式中存在以下4个角色:
抽象建造者(Builder)角色:给出一个抽象接口,用以规范产品对象的各个组成成分的建造。
具体建造者(ConcreteBuilder)角色:实现Builder接口,主要完成两方面工作:1.实现Builder声明的所有的接口,给出一步一步地完成创建产品实例的操作;2.在建造完成后,给出一个产品实例。
导演者(Director)角色:调用具体建造者提供的方法完成产品的创建。该角色无需知道产品的具体的内部细节,只需按照建造者提供的操作方法操作即可。
产品(Product)角色:具有复杂的内部结构。
/**
* 具体产品:电脑
* 说明:电脑具有复杂的内部结构
* */
public class Computer {
private String monitor;//显示器
private String mainBoard;//主板
private String cpu;//
public String getMonitor() {
return monitor;
}
public void setMonitor(String monitor) {
this.monitor = monitor;
}
public String getMainBoard() {
return mainBoard;
}
public void setMainBoard(String mainBoard) {
this.mainBoard = mainBoard;
}
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
}
/**
* 抽象建造者角色:电脑组装过程规范化
* */
public interface ComputerBuilder {
/**
* 组装显示器
* */
void buildMonitor();
/**
* 组装主板
* */
void buildMainBoard();
/**
* 组装CPU
* */
void buildCpu();
public Computer createComputer();
}
/**
* 具体建造者角色:台式电脑的具体组装过程
* */
public class DesktopComputerBuilder implements ComputerBuilder{
private Computer computer = new Computer();
@Override
public void buildMonitor() {
computer.setMonitor("三星");
}
@Override
public void buildMainBoard() {
computer.setMainBoard("华硕");
}
@Override
public void buildCpu() {
computer.setCpu("AMD");
}
@Override
public Computer createComputer() {
// TODO Auto-generated method stub
return computer;
}
}
/**
* 导演者角色:电脑组装工人
* 说明:工人无需电脑相关内部构成,只需按照组装说明书(就是具体的建造者)组装就行了
* */
public class ComputerWoker {
/**
* 持有当前需要使用的建造器对象
*/
private ComputerBuilder builder;
public ComputerWoker(ComputerBuilder builder) {
this.builder = builder;
}
/**
* 工人按照组装说明书组装即可
* */
public void buildComputer() {
builder.buildCpu();
builder.buildMainBoard();
builder.buildMonitor();
}
}
public class Client {
public static void main(String[] args) {
/**
* 客户:我想要一台台式机
* 厂商:好的,我把组装手册给工人,工人给你组装一台
* */
//组装手册
ComputerBuilder builder = new DesktopComputerBuilder();
//工人按照手册组装
ComputerWoker woker = new ComputerWoker(builder);
//工人开始组装
woker.buildComputer();
//按照手册,得到最终的产品
Computer computer = builder.createComputer();
System.out.println("主板:"+computer.getMainBoard()+"\n"
+"CPU:"+computer.getCpu()+"\n"
+"显示器:"+computer.getMonitor());
}
}
输出结果:
主板:华硕
CPU:AMD
显示器:三星
使用场景:
- 当生成的产品对象内部具有复杂的构造时;
- 当复杂对象需要与表示分离,可能需要创建不同的表示时;
- 当需要向客户隐藏产品内部结构的表现时。