1、定义
Separate the construction of a complex object from its representation so that the same construction process can create different representations.
将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。
2、使用场景
- 相同的方法,不同的执行顺序,产生不同的结果时
- 多个部件或零件,都可以装配到同一个对象时,但是产生的运行结果又不相同时
- 产品类非常复杂,或者产品类中的方法调用顺序不同会产生不同的效果
- 初始化一个对象特别复杂,如参数多,且很多参数有具有默认值
3、UML类图
角色介绍:
- 抽象建造者Builder:用于规范产品的各个组成部分,并进行抽象,一般独立于应用程序的逻辑。
- 具体建造者ConcreteBuilder:实现Builder中定义的所有方法,并且返回一个组件好的产品
- 产品Product:建造中的复杂产品
- 导演者Director:统一组装过程
4、示例
计算机的组装过程较为复杂,并且组装顺序不固定,为了方便,我们把计算机组装的过程简化成构建主机、设置操作系统、设置显示器3个部分,然后通过Director和具体的Builder来构建计算机对象。
/**
* 计算机抽象类,即Product
* @author Administrator
*
*/
public class Computor {
private String board;
private String display;
private String os;
public String getBoard() {
return board;
}
public void setBoard(String board) {
this.board = board;
}
public String getDisplay() {
return display;
}
public void setDisplay(String display) {
this.display = display;
}
public String getOs() {
return os;
}
public void setOs(String os) {
this.os = os;
}
@Override
public String toString() {
return "Computor [board=" + board + ", display=" + display + ", os=" + os + "]";
}
}
/**
* 具体产品类
* @author Administrator
*
*/
public class MacBook extends Computor{
}
/**
* 抽象的Builder类
* @author Administrator
*
*/
public abstract class Builder {
// 设置主机
public abstract void buildBoard(String board);
// 设置显示器
public abstract void buildDisplay(String display);
// 设置操作系统
public abstract void buildOS();
// 创建Computor
public abstract Computor create();
}
/**
* 抽象的Builder类
* @author Administrator
*
*/
public abstract class Builder {
// 设置主机
public abstract void buildBoard(String board);
// 设置显示器
public abstract void buildDisplay(String display);
// 设置操作系统
public abstract void buildOS();
// 创建Computor
public abstract Computor create();
}
/**
* 抽象的Builder类
* @author Administrator
*
*/
public abstract class Builder {
// 设置主机
public abstract void buildBoard(String board);
// 设置显示器
public abstract void buildDisplay(String display);
// 设置操作系统
public abstract void buildOS();
// 创建Computor
public abstract Computor create();
}
/**
* 客户端调用
* @author Administrator
*
*/
public class Client {
public static void main(String[] args) {
Builder builder = new MacBookBuilder();
Director director = new Director(builder);
director.construct("英特尔主板", "Retina显示器");
System.out.println("Computor info : " + builder.create().toString());
}
}
5、总结
优点:
- 封装性,使得客户端不避知道产品内部的组成细节
- 建造者独立,容易扩展
- 易于控制细节风险,由于建造者是独立的,因此对构建造过程逐步细化,不会对其他模块产生任何影响,
缺点:
- 产生多余的Builder对象以及Director对象,消耗内存