工廠方法模式
定義一個用於創建對象的接口,由子類決定將哪一類實例化。
Facory method使得一個類的實例化延遲到其子類。
結構圖
優缺點
優點:
a.克服了簡單工廠模式違背開放-封閉原則的缺點,又保持了封裝對象創建過程中的優點。
b.集中封裝了對象的創建,使得要更換對象時,不需要做大的改動就可以實現。擴展性好,在增加產品類的情況下,只需要適當修改具體的工廠類或擴展一個工 廠類,就可“擁抱變化”。
c.降低了客戶程序和產品對象的耦合。屏蔽產品類。產品類的實現如何變化,調用者都不需要關心,只需關心產品的接口,只要接口保持不變,系統中的上層模塊就不會發生變化。
e、多態性:客戶代碼可以做到與特定應用無關,適用於任何實體類。
f、子類提供掛鉤。基類爲工廠方法提供缺省實現,子類可以重寫新的實現,也可以繼承父類的實現。— 加一層間接性,增加了靈活性
g、連接並行的類層次結構。良好的封裝性,代碼結構清晰。
h、典型的解耦框架。高層模塊只需要知道產品的抽象類,其他的實現類都不需要關心,符合迪米特法則,符合依賴倒置原則,符合里氏替換原則
缺點:
a.每增加一個產品,就需要增加一個產品工廠的類,增加額外的開發量。
實現
public void wash(){
System.out.println("洗衣");
}
public void cook(){
System.out.println("做飯");
}
}
public Student(){
System.out.println("我是學生");
}
}
public Vol(){
System.out.println("我是志願者");
}
}
public LeiFeng createLeiFengFactory();
}
public LeiFeng createLeiFengFactory(){
return new Student();
}
}
public LeiFeng createLeiFengFactory(){
return new Student();
}
}
public static void main(String[] args) {
LearnLeiFengFactory factory = new StudentFactory();//在這裏進行判斷,來決定生成哪個對象的實例,如果需求需要志願者,則生成志願者的工廠
LeiFeng lf = factory.createLeiFengFactory();
lf.wash();
}
}
洗衣