簡單工廠

簡單工廠,其實不是一個設計模式,反而更像一個種編程習慣。但是它的卻別程序員頻繁使用。

當看到“new”,就會想到“具體”。是的,使用new時,你的確實是在實例化一個具體類,所以用的確實是實現,而不是接口。如:

Duck  duck = new MallardDuck();

當一羣相關的具體類時,通常會寫出這樣的代碼:

public Pizza orderPizza(String type) {
Pizza pizza = null ;
 if ("cheese".equals(type)) {
pizza = new CheesePizza();
} else if ("pepperoni".equals(type)) {
pizza = new PepperoniPizza();
} else if ("clam".equals(type)) {
pizza= new ClamPizza();
}

}

爲了讓系統更有彈性,我們希望修改的地方更少一點,因此遵循對擴展開放,對修改關閉的原則,讓我們建立簡單工程吧。

首先把創建對象的代碼從orderPizza()方法中抽離。

然後將創建對象的部分代碼搬到另一個對象中,這個對象只管如何創建比薩。

public class SimplePizzaFactory {
	/*
	 * 這樣做的好處,就在於SimplePizzaFactory可以有許多客戶。
	 * 例如:披薩店菜單PizzaShopMenu會利用這個工程來取得比薩的價錢和描述
	 * 可能有會一個宅急送HomeDeliver與Pizzashop類不同的方式來處理披薩。
	 * 把創建比薩的代碼包裝進一個類,當以後實現改變時,只需修改這個類即可
	 * 作用或目的:把實例化的代碼從客戶代碼中刪除.
	 * 另:利用靜態方法定義個簡單的工廠也是常見做法。
	 */
	public Pizza createPize(String type){
		Pizza pizza = null;
		if ("cheese".equals(type)) {
			pizza = new CheesePizza();
		} else if ("pepperoni".equals(type)) {
			pizza = new PepperoniPizza();
		} else if ("clam".equals(type)) {
			pizza= new ClamPizza();
		}//這裏將會有更多不同類型的披薩出現
		
		return pizza;
	}
}
public class PizzaStore {
	SimplePizzaFactory factory;

	public PizzaStore(SimplePizzaFactory factory){
		this.factory = factory;
	}
	
	public Pizza orderPizza(String type) {
		Pizza pizza = null ;
		/*把創建對象的代碼從這裏抽離出來,放到一個新的類中
		 * if ("cheese".equals(type)) {
			pizza = new CheesePizza();
		} else if ("pepperoni".equals(type)) {
			pizza = new PepperoniPizza();
		} else if ("clam".equals(type)) {
			pizza= new ClamPizza();
		}*/
		factory.createPize(type);
		pizza.prepare();
		pizza.bake();
		pizza.cut();
		pizza.box();
		return pizza;
	}
}
說明:Pizza爲一個抽象類,它有相關的方法,以及它的相關子類,這裏就不一一貼上來了。

提醒:在設計模式中,所謂的“實現一個接口”,並不一定,表示“寫一個類,並利用implement關鍵詞來實現某個Java接口”。“實現一個接口”泛指“實現某個超類型(可以是類或接口的某個方法)”


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章