建立型-Builder

小弟季義欽發表於2013-03-28
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();
	}
}

相關文章