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的子類中。
。。。。菜啊