定义
将一个杂乱目标的构建与它的表明别离,使得相同的构建进程能够创立不同的表明
运用场景
- 相同的办法,不同的执行次序,发生不同的事情成果时
- 多个部件或零件,都能够装配到一个目标中,但是发生的运行成果又不相同时
- 产品类非常杂乱,或者产品类中的调用次序不同发生可不同的效果
- 当初始化一个目标特别杂乱,如参数多,且很多参数都具有默认值时
UML类图
- Product产品类——产品的笼统类
- Builder——笼统Builder类,标准产品的组件,一般是由子类完成详细的组件进程
- ConcreteBuilder——详细的Builder类
- Director——一致的组装进程
简略完成
//Product产品笼统类
//计算机笼统类
public abstract class Computer {
protected String mBoard;
protected String mDisplay;
protected String mOS;
protected Computer() {
}
//设置主板
public void setBoard(String board) {
this.mBoard = board;
}
//设置显示器
public void setDisplay(String display) {
this.mDisplay = display;
}
//设置操作系统
public abstract void setOS();
@Override
public String toString() {
return "Computer{" +
"mBoard='" + mBoard + '\'' +
", mDisplay='" + mDisplay + '\'' +
", mOS='" + mOS + '\'' +
'}';
}
}
//Product产品完成类
//详细的Computer类:Macbook
public class Macbook extends Computer{
protected Macbook(){
}
@Override
public void setOS() {
mOS="Mac OS X 10.10";
}
}
//笼统的Builder
public abstract class Builder {
//设置主板
public abstract void buildBoard(String board);
//设置显示器
public abstract void buildDisplay(String display);
//设置操作系统
public abstract void buildOS();
//创立Computer
public abstract Computer create();
}
//Builder完成类
public class MacbookBuilder extends Builder{
private Computer mComputer=new Macbook();
@Override
public void buildBoard(String board) {
mComputer.setBoard(board);
}
@Override
public void buildDisplay(String display) {
mComputer.setDisplay(display);
}
@Override
public void buildOS() {
mComputer.setOS();
}
@Override
public Computer create() {
return mComputer;
}
}
//Director类,负责结构Computer
public class Director {
Builder mBuilder=null;
public Director(Builder mBuilder) {
this.mBuilder = mBuilder;
}
//结构目标
public void construct(String board,String display){
mBuilder.buildBoard(board);
mBuilder.buildDisplay(display);
mBuilder.buildOS();
}
}
运用
public static void main(String[] args) {
//构建器
Builder builder=new MacbookBuilder();
//Director
Director director=new Director(builder);
//封装构建进程
director.construct("英特尔主板","Retina显示器");
//构建计算机,输出相关信息
System.out.println(builder.create().toString());
}
Director封装了构建杂乱产品目标的进程,对外躲藏构建细节
Builder和Director将一个杂乱目标的构建与它的表明别离,使得相同的构建进程能够创立不同的目标
实际开发中,一般省略Director人物
直接运用一个Builder来进行目标的组装,这个Builder一般为链式调用
要害点是每个setter办法都返回自身,使得setter办法能够链式调用。
public abstract class Builder {
//设置主板
public abstract Builder buildBoard(String board);
//设置显示器
public abstract Builder buildDisplay(String display);
//设置操作系统
public abstract void buildOS();
//创立Computer
public abstract Computer create();
}
public class MacbookBuilder extends Builder{
private Computer mComputer=new Macbook();
@Override
public Builder buildBoard(String board) {
mComputer.setBoard(board);
return this;
}
@Override
public Builder buildDisplay(String display) {
mComputer.setDisplay(display);
return this;
}
@Override
public void buildOS() {
mComputer.setOS();
}
@Override
public Computer create() {
return mComputer;
}
}
链式运用:
public static void main(String[] args) {
//构建器
Builder builder=new MacbookBuilder();
builder.buildBoard("英特尔主板").buildDisplay("Retina显示器").create();
}