一、概念
将一个复杂对象的构建过程和它的表示分离,使得相同的构建过程创建不同的表示。
二、UML类图
UML类图如下图所示。
角色介绍:
Product产品类-产品的抽象类
Builder-抽象的Builder类,规范产品的组建,一般是由子类实现具体的组建过程;
ConcreteBuilder——具体的Bilder类;
Director——统一组装过程

三、使用场景
1、相同的方法,不同执行顺序,产生不同的事件结果时。
2、多个部件或零件,都可以装配到同一个对象,但是产生运行结果又不相同时。
3、产品类非常复杂,或者产品类地中的调用顺序不同产生不同的作用,这个时候使用非常合适。
4、当初始化一个对象非常复杂,如参数多,且很多的参数都具有默认值。
四、代码实现
public abstract class Computer {
protected String mBroad;
protected String mDisplay;
protected String mOS;
protected Computer() {
}
public void setmBroad(String mBroad) {
this.mBroad = mBroad;
}
public void setmDisplay(String mDisplay) {
this.mDisplay = mDisplay;
}
public abstract void setmOS();
@Override
public String toString() {
return "Computer [mBroad=" + mBroad + ", mDisplay=" + mDisplay
+ ", mOS=" + mOS + "]";
}
}
public class MacBook extends Computer {
@Override
public void setmOS() {
mOS = "Mac os x 12";
}
}
public abstract class Builder {
// 设置主机
public abstract void setBuilderBoard(String borad);
// 设置显示器
public abstract void setBuilderDisplay(String display);
// 设置操作系统
public abstract void setBuilderOS();
// 创建计算机
public abstract Computer createComputer();
}
public class MacBuilder extends Builder {
private Computer maComputer = new MacBook();
@Override
public void setBuilderBoard(String borad) {
maComputer.setmBroad(borad);
}
@Override
public void setBuilderDisplay(String display) {
maComputer.setmDisplay(display);
}
@Override
public void setBuilderOS() {
maComputer.setmOS();
}
@Override
public Computer createComputer() {
// TODO Auto-generated method stub
return maComputer;
}
}
public class Director {
Builder mBuilder = null;
public Director(Builder builder) {
mBuilder = builder;
}
public void construct(String borad, String display) {
mBuilder.setBuilderBoard(borad);
mBuilder.setBuilderDisplay(display);
mBuilder.setBuilderOS();
}
}
public class Test {
public static void main(String[] args) {
Builder macBook = new MacBuilder();
Director director = new Director(macBook);
director.construct("英特尔", "Retina显示器");
System.out.println(macBook.createComputer());
}
}
五、总结
优点:
1、良好的封装性,可以使客户端不用知道产品内部组装的过程。
2、建造者独立,可扩展性强。
缺点:
会产生多余的Builder对象和Director对象,消耗内存