Builder (生成器)
一、意图
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
二、结构
生成器模式的结构如图7-26所示。
其中:
• Builder为创建一个Product对象的各个部件指定抽象接口。
• ConcreteBuilder实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,提供一个检索产品的接口。
• Diiector构造一个使用Builder接口的对象。
• Product表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。包含定义组成组件的类,包括将这些组件装配成最终产品的接口。
三、适用性
Builder模式适用于:
• 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
• 当构造过程必须允许被构造的对象有不同的表示时。
四、实现
某快餐厅主要制作并出售儿童套餐,一般包括主餐(各类比萨)、饮料和玩具,其餐品种类可能不同,但其制作过程相同。前台服务员(Waiter)调度厨师制作套餐。现采用生成器(Builder)模式实现制作过程,得到如图 6-1 所示的类图。
首先定义披萨实体
。
class Pizza{
private String parts;
public void setParts(String parts){
this.parts = parts;
}
public String toString(){
return this.parts;
}
}
然后定义一个抽象生成器以及两种具体生成器
。
abstract class PizzaBuilder{
protected Pizza pizza;
public Pizza getPizza(){
return pizza;
}
public void createNewPizza(){
pizza = new Pizza();
}
public abstract void buildParts() ;
}
class HawaiianPizzaBuilder extends PizzaBuilder{
public void buildParts(){
pizza.setParts("cross + mild + ham&pineapp1e");
}
}
class SpicyPizzaBuilder extends PizzaBuilder{
public void buildParts(){
pizza.setParts("panbaked + hot + pepperoni&salami");
}
}
其次 定义服务员实体
。
class Waiter{
private PizzaBuilder pizzaBuilder;
public void setPizzaBuilder(PizzaBuilder pizzaBuilder){
/*设置构建器*/
this.pizzaBuilder = pizzaBuilder;
}
public Pizza getPizza(){
return pizzaBuilder.getPizza();
}
public void construct(){
/* 构建 */
pizzaBuilder.createNewPizza();
pizzaBuilder.buildParts();
}
}
最后 测试一下
。
public class Builder {
public static void main(String[] args) {
// TODO Auto-generated method stub
Waiter waiter = new Waiter();
PizzaBuilder hawaiian_pizzabuilder = new HawaiianPizzaBuilder();
waiter.setPizzaBuilder(hawaiian_pizzabuilder);
waiter.construct();
System.out.println("pizza:" + waiter.getPizza());
System.out.println("=========================================");
PizzaBuilder spicy_pizzabuilder = new SpicyPizzaBuilder();
waiter.setPizzaBuilder(spicy_pizzabuilder);
waiter.construct();
System.out.println("pizza:" + waiter.getPizza());
}
}
运行结果: