package builder;
/**
* @author jiq
* 类型: Creational
* 定义:是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),
* 对这个抽象过程的不同实现,可以构造出表现(属性)不同的对象。
* 适用性:在以下情况使用生成器模式:
* (1)当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时;
* (2)当构造过程必须允许被构造的对象有不同的表示时。
* 参与者:
* (1)Builder:为创建一个Product对象的各个部件指定抽象接口。
* (2)ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件。
* 定义并明确它所创建的表示。
* 提供一个检索产品的接口
* (3)Director:构造一个使用Builder接口的对象。
* (4)Product:表示被构造的复杂对象。ConcreateBuilder创建该产品的内部表示并定义它的装配过程。
* 包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
* 协作: 客户创建Director对象,并用它所想要的Builder对象进行配置。
* 一旦产品部件被生成,导向器就会通知生成器。
* 生成器处理导向器的请求,并将部件添加到该产品中。
* 客户从生成器中检索产品。
*/
/** "Product" */
class Pizza {
private String dough = "";
private String sauce = "";
private String topping = "";
public void setDough (String dough) { this.dough = dough; }
public void setSauce (String sauce) { this.sauce = sauce; }
public void setTopping (String topping) { this.topping = topping; }
public void showPizza(){System.out.print(dough+","+sauce+","+topping);}
}
/** "Abstract Builder" */
abstract class PizzaBuilder {
protected Pizza pizza;
public Pizza getPizza() { return pizza; }
public void createNewPizzaProduct() { pizza = new Pizza(); }
public abstract void buildDough();
public abstract void buildSauce();
public abstract void buildTopping();
}
/** "ConcreteBuilder" */
class HawaiianPizzaBuilder extends PizzaBuilder {
public void buildDough() { pizza.setDough("cross"); }
public void buildSauce() { pizza.setSauce("mild"); }
public void buildTopping() { pizza.setTopping("ham+pineapple"); }
}
/** ConcreteBuilder */
class SpicyPizzaBuilder extends PizzaBuilder {
public void buildDough() { pizza.setDough("pan baked"); }
public void buildSauce() { pizza.setSauce("hot"); }
public void buildTopping() { pizza.setTopping("pepperoni+salami"); }
}
/** "Director" */
class Waiter {
private PizzaBuilder pizzaBuilder;
public void setPizzaBuilder (PizzaBuilder pb) { pizzaBuilder = pb; }
/**
* 将复杂产品的创建过程封装起来
* 产品的实现可以被替换
* 因为通过多个步骤创建对象,所以过程可以改变,这里和只有一个步骤的工厂模式不同
*/
public void constructPizza() {
pizzaBuilder.createNewPizzaProduct();
pizzaBuilder.buildDough();
pizzaBuilder.buildSauce();
pizzaBuilder.buildTopping();
}
public Pizza getPizza() { return pizzaBuilder.getPizza(); }
}
/** A customer ordering a Pizza. */
public class BuilderTest {
public static void main(String[] args) {
Waiter waiter = new Waiter();
//创建两个不同的Pizza构造器
PizzaBuilder hawaiian_pizzabuilder = new HawaiianPizzaBuilder();
PizzaBuilder spicy_pizzabuilder = new SpicyPizzaBuilder();
//根据Director的指导构建一个HawaiianPizza
waiter.setPizzaBuilder(hawaiian_pizzabuilder);
waiter.constructPizza();
Pizza hawaPizza = waiter.getPizza();
hawaPizza.showPizza();
//根据Director的指导构建一个SpicyPizza
waiter.setPizzaBuilder(spicy_pizzabuilder);
waiter.constructPizza();
Pizza spicyPizza = waiter.getPizza();
spicyPizza.showPizza();
}
}