初探設計模式——工廠模式

Pizza是超類型,CheesePizza、ClamPizza是其子類。
public abstract class Pizza{
	void prepare(){}
	void box(){}
}

得到一個具體對象:

Pizza cheesePizza=new CheesePizza();

得到多個具體對象:

Pizza pizza;	
if("cheese") 
	pizza=new CheesePizza();
else if("clam")
	pizza=new ClamPizza();
else if()...
如果要對Pizza類進行擴展就要在客戶類中修改這段代碼,違反了對修改封閉的原則
應用封裝變化的原則,把這段具體實例化的過程抽離到一個類中,我們把這個類就叫工廠,用來處理創建對象的細節。

創建一個簡單工廠,封裝創建對象的代碼,返回值爲工廠產品

public class SimpleFactory{
	public Pizza createPizza(String type){	//通過這個方法實例化對象
		Pizza pizza =null;
		if(type.equals("cheese")){
			pizza=new CheesePizza();
		}else if(){}
		return pizza;
	}
}
		

這個工廠可以有很多客戶,寫一個PizzaStore客戶不通過具體實例化來獲得工廠產品

public class PizzaStore{
	SimplePizzaFactory factory;		//傳入工廠類引用,用來獲得pizza對象
	public PizzaStory(SimplePizzaFactory factory){
		this.factory=factory;			//將引用指向工廠對象
	}
	public Pizza orderPizza(String type){
		Pizza pizza;
		pizza=factory.creatPizza(type); 	//產生一個實例化對象並賦給pizza這個引用,這樣客戶中不需要出現具體實例化
		pizza.prepare();
		pizza.box();
		return pizza;
	}
}

這樣通過PizzaStore就可以獲得pizza對象,如果想要得到不同特色種的pizza只要多寫幾個簡單工廠就行了

現在把PizzaStory作爲超類,create方法變成抽象方法
這樣通過繼承這個超類,不同子類分別實現create方法也可以得到不同風味的pizza
把 orderPizza聲明成final,prepare box等方法就被保證不被修改
public abstract class PizzaStore{
	public Pizza orderPizza(String type){
		Pizza pizza;

		pizza=createPizza(type);

		pizza.prepare();
		pizza.box();
		return pizza;
	}
	abstract Pizza createPizza(String type);
}

orderPizza實現瞭解耦,對修改封閉,對擴展開放。

工廠方法模式:定義一個創建對象的接口,但由繼承來的子類決定要實例化的類是哪一個。工廠方法讓類把實例化推遲到子類。

  • 依賴倒置原則:要依賴抽象,不要依賴具體類。
  • 變量不可以持有具體類的引用
  • 不要讓類派生自具體類
  • 不要覆蓋基類中已經實現的方法

抽象工廠模式:提供一個接口,用於創建相關或依賴對象的家族,而不需要明確指定具體類
定義一個接口,子類實現pizza原料的方法,將子類實例化後組合到抽象類Pizza和PizzaStory的子類中。
。。。。菜啊

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