一、使用场景
1、概念:将一个复杂对象的构件与它的表示分离,使得同样的构件过程可以创建不同的表示。如果使用的建造者模式那么用户只需指定需要建造的类型就可以得到他们,而具体的建造过程和细节就不需要知道了。
2、首先要明确使用建造者模式时,需要建造的复杂对象需要一个固定的抽象流程。
3、不同的产品对象在构造时,可以定义一个具体的建造者。
二、UML类图
三、角色说明
Builder:是一个产品建造的具体的抽象过程。
ConcreteBuilder:是一个具体的实现上面抽象过程的实现类,包含过程的每一步,每一步都是具体产品Product的创建步骤。
Product:是由ConcreteBuilder创建出来的一个产品。
Director:为指挥者,在建造者建造对象时需要建造那个对象的指挥。
四、具体代码
package com.jieruan.test;
/**
* 具体的产品——汽车
* @author WL
*
*/
public class Car {
//复杂对象时具体的属性可能又是一个类
private String type; //车辆类型,例如小轿车、SUV等
private String color; //车辆颜色
private Integer passengers; //乘坐人数
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public Integer getPassengers() {
return passengers;
}
public void setPassengers(Integer passengers) {
this.passengers = passengers;
}
}
package com.jieruan.test;
/**
* 建造过程的一个抽象类,把具体的过程抽象了一下
* @author WL
*
*/
public interface Builder {
//创建具体产品的过程
void buildCarType();
void buildCarColor();
void buildCarPassengers();
//创建具体的产品
Car buildCar();
}
package com.jieruan.test;
/**
* 一个吉普车的创建者
* @author WL
*
*/
public class JeepConcreteBuilder implements Builder{
//对一个复杂产品的申明
Car jeepCar;
public JeepConcreteBuilder(Car jeepCar) {
this.jeepCar = jeepCar;
}
//实现具体的构件过程
@Override
public void buildCarType() {
jeepCar.setType("吉普车");
}
@Override
public void buildCarColor() {
jeepCar.setColor("军绿色");
}
@Override
public void buildCarPassengers() {
jeepCar.setPassengers(5);
}
@Override
public Car buildCar() {
System.err.println(jeepCar.getType());
System.err.println(jeepCar.getColor());
System.err.println(jeepCar.getPassengers());
return jeepCar;
}
}
package com.jieruan.test;
/**
* 建造者的指挥者
* @author WL
*
*/
public class CarDirictor {
public void construct(Builder builder)
{
builder.buildCarType();
builder.buildCarColor();
builder.buildCarPassengers();
}
public static void main(String args[])
{
CarDirictor cd = new CarDirictor();
Builder jb = new JeepConcreteBuilder(new Car());
cd.construct(jb);
jb.buildCar();
}
}