設計模式-工廠方法模式(創建型模式)

工廠方法模式

定義一個用於創建對象的接口,由子類決定將哪一類實例化。

Facory method使得一個類的實例化延遲到其子類。

結構圖


優缺點

    優點:

    a.克服了簡單工廠模式違背開放-封閉原則的缺點,又保持了封裝對象創建過程中的優點。

    b.集中封裝了對象的創建,使得要更換對象時,不需要做大的改動就可以實現。擴展性好,在增加產品類的情況下,只需要適當修改具體的工廠類或擴展一個工       廠類,就可“擁抱變化”。

    c.降低了客戶程序和產品對象的耦合。屏蔽產品類。產品類的實現如何變化,調用者都不需要關心,只需關心產品的接口,只要接口保持不變,系統中的上層模塊就不會發生變化。

   e、多態性:客戶代碼可以做到與特定應用無關,適用於任何實體類。

   f、子類提供掛鉤。基類爲工廠方法提供缺省實現,子類可以重寫新的實現,也可以繼承父類的實現。— 加一層間接性,增加了靈活性
   g、連接並行的類層次結構。良好的封裝性,代碼結構清晰。
   h、典型的解耦框架。高層模塊只需要知道產品的抽象類,其他的實現類都不需要關心,符合迪米特法則,符合依賴倒置原則,符合里氏替換原則

    缺點:

    a.每增加一個產品,就需要增加一個產品工廠的類,增加額外的開發量。

    

實現

   這裏就以《大話設計模式》裏的學雷鋒爲例。
   雷鋒對象作爲一個對象,擁有兩個子節點。大學生和志願者,他們繼承了雷鋒對象,擁有父級節點特有的屬性和方法。
   做好事 作爲一個工廠,該工廠負責生成雷鋒對象,志願者工廠和大學生工廠作爲兩個子節點。在志願者工廠裏可以生成志願者對象,在大學生工廠可以生成大學生對象。
   uml圖如下所示:
   



LeiFeng對象:
public class LeiFeng {

public void wash(){
System.out.println("洗衣");
}

public void cook(){
System.out.println("做飯");
}
}

大學生和志願者:
public class Student extends LeiFeng{

public Student(){
System.out.println("我是學生");
}
}

public class Vol extends LeiFeng{
public Vol(){
System.out.println("我是志願者");
}
}

學雷鋒工廠接口:
public interface LearnLeiFengFactory {

public LeiFeng createLeiFengFactory();


}

兩個接口的實現,分別生成對應的實例(詮釋工廠方法模式使實例的生成進行延遲)

public class StudentFactory implements LearnLeiFengFactory{


public LeiFeng createLeiFengFactory(){
return new Student();
}
}

public class VolFactory implements LearnLeiFengFactory{

public LeiFeng createLeiFengFactory(){
return new Student();
}
}


main方法:這裏將簡單工廠裏的內部邏輯判斷移到客戶端來進行
public class Main {

public static void main(String[] args) {
LearnLeiFengFactory factory = new StudentFactory();//在這裏進行判斷,來決定生成哪個對象的實例,如果需求需要志願者,則生成志願者的工廠
LeiFeng lf = factory.createLeiFengFactory();
lf.wash();
}
}

執行結果:
我是學生
洗衣





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