建造模式的本质
- 分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象
- 由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象; 相同的构建器,不同的装配顺序也可以做出不同的对象
示例
/**
* 早餐套餐
*/
public class Breakfast {
// 主食
private String food;
// 饮料
private String drink;
public String getFood() {
return food;
}
public void setFood(String food) {
this.food = food;
}
public String getDrink() {
return drink;
}
public void setDrink(String drink) {
this.drink = drink;
}
}
/**
* 早餐套餐
*
*/
public abstract class BreakfastBuilder {
// 早餐
Breakfast breakfast = new Breakfast();
public abstract void buildFood();
public abstract void buildDrink();
public Breakfast getBreakfast() {
return breakfast;
}
}
/**
* 早餐套餐A
*
* @author jonnyjiang
*
*/
public class BreakfastABuilder extends BreakfastBuilder {
public void buildFood() {
breakfast.setFood("油条");
}
public void buildDrink() {
breakfast.setDrink("豆浆");
}
}
/**
* 早餐套餐B
*
* @author jonnyjiang
*
*/
public class BreakfastBBuilder extends BreakfastBuilder {
public void buildFood() {
breakfast.setFood("面包");
}
public void buildDrink() {
breakfast.setDrink("牛奶");
}
}
/**
* 服务员-组装者
*/
public class WaiterDirector {
private BreakfastBuilder breakfastBuilder;
public WaiterDirector(BreakfastBuilder breakfastBuilder) {
this.breakfastBuilder = breakfastBuilder;
}
public Breakfast construct() {
breakfastBuilder.buildFood();
breakfastBuilder.buildDrink();
return breakfastBuilder.getBreakfast();
}
}
public class Client {
public static void main(String[] args) {
// 套餐A
BreakfastBuilder breakfastBuilder = new BreakfastABuilder();
// 告诉服务员要套餐A
WaiterDirector waiterDirector = new WaiterDirector(breakfastBuilder);
// 套餐A制造完
Breakfast breakfast = waiterDirector.construct();
System.out.println("食物:" + breakfast.getFood() + ";饮品:" + breakfast.getDrink());
// 套餐B
BreakfastBuilder breakfastBuilder2 = new BreakfastBBuilder();
// 告诉服务员要套餐B
WaiterDirector waiterDirector2 = new WaiterDirector(breakfastBuilder2);
// 套餐B制造完
Breakfast breakfast2 = waiterDirector2.construct();
System.out.println("食物:" + breakfast2.getFood() + "; " + "饮品:" + breakfast2.getDrink());
}
}
开发中应用场景
– StringBuilder类的append方法
– SQL中的PreparedStatement
– JDOM中,DomBuilder、SAXBuilder