設計模式GOF23——工廠模式

簡單工廠模式(Static Factory Method)是創建者模式的一種,是負責創建對象的模式。

模式的職責

工廠模式是爲了實現創建對象和調用對象分離的需求。
簡單工廠用來生產同一等級結構中的任意產品。(對於新增的產品需要修改已有代碼)
工廠方法模式用來生產同意等級結構中的固定產品。(支持增加任意產品)
抽象工廠模式用來生產不同品種族的全部產品。(對於增加新的產品,無能爲例,支持增加新的產品族)

爲什麼要創建和調用分離

當然是爲了簡化操作,爲了封裝型。爲了把創建對象的邏輯和調用對象的邏輯分開來,對一些可能比較複雜的創建對象的操作進行封裝,隔離複雜性,也保持封裝性。工廠模式主要出於迪米特原則(最少知道原則)和開閉原則的考慮。

模式的實現

  1. 簡單工廠模式
    創建一個創建者對象(工廠Factory),在這個對象中封裝創建對象的方法。至於對象的創建,可以通過接口來定義類的種類和一些必要的方法和參數,具體對象實現接口即可。
    這樣做完成了對創建和調用的分離。但是這個方法有一些不足:只能在工廠創建已知的對象創建的方法,如果需要擴展,就需要修改原有的代碼,這樣違反了開閉原則。
    下面是一個簡單的小例子,用來方便理解
//創建對象的抽象,可以抽象對象的必要方法和變量
public interface Car {
    void run();
    void stop();
}
public class BYD implements Car{

    public void run() {
        //奔跑方法的實現
    }

    public void stop() {
        //停止方法的實現
    }

}
public class FAWVolkswagen implements Car{

    public void run() {
        //奔跑方法的實現
    }

    public void stop() {
        //停止方法的實現
    }
}
//創建的工廠
public class SimpleFactory {
    //創建實際對象的方法,具體創建方法由邏輯決定
    public Car createBYD(){
        Car c =new BYD();
        return c;
    }
    //簡單工廠將不同的對象創建方法放在同一個類當中
    public Car createFAWVolkswagen(){
        Car c =new FAWVolkswagen();
        return c;
    }
}
  1. 工廠模式
    爲每一個對象創建創建者對象(工廠Factory),在這個對象中封裝創建對象的方法。至於對象的創建,可以通過接口來定義類的種類和一些必要的方法和參數,具體對象實現接口即可。
    這樣做完成了對創建和調用的分離,也可以在一定成都上擴展型更強。但是這個方法有一些不足:它會增加更多的類,需要更多的代碼,對於代碼的控制和管理不方便。

一個簡單的例子方便理解

//創建對象的抽象,可以抽象對象的必要方法和變量
public interface Car {
    void run();
    void stop();
}
public class BYD implements Car{

    public void run() {
        //奔跑方法的實現
    }

    public void stop() {
        //停止方法的實現
    }

}
public class FAWVolkswagen implements Car{

    public void run() {
        //奔跑方法的實現
    }

    public void stop() {
        //停止方法的實現
    }
}
//BYD的創建工廠
public class BYDFactory {
    //創建實際對象的方法,具體創建方法由邏輯決定
    public Car createBYD(){
        Car c =new BYD();
        return c;
    }

}
//FAWVolkswagen創建的工廠
public class FAWVolkswagenFactory {
    //工廠將不同的對象創建方法放在不同的類當中
    public Car createFAWVolkswagen(){
        Car c =new FAWVolkswagen();
        return c;
    }

}

工廠模式和簡單工廠模式的比較

  • 結構複雜度
    這個方面比較,簡單工廠明顯佔優勢,簡單工廠只需要一個工廠類,而工廠模式的工廠數量會隨着對象的個數而增多,這無疑會使類越來越多,結構就越來越複雜。
  • 代碼複雜度
    代碼複雜度和結構複雜度是一個矛盾,既然簡單工廠模式在結構上比較簡單,那麼它在代碼方面肯定比工廠方法複雜(需要在更少的類裏面管理更多的信息)。
  • 客戶端編譯難度
    工廠方法雖然在工廠類的結構上引入結構中滿足了開閉原則(OCP),但是在客戶端編碼的時候需要對相應的工廠實例化。而簡單工廠只需要實例化一個整體的工廠就足夠了。
  • 管理上的難度
    這個是關鍵的問題。
    工廠方法的優勢在於擴展性更好,但是簡單工廠方式也不是沒有可擴展性,只是需要修改相應的代碼。雖然這樣不滿足開閉原則,但是設計原則是爲了方便管理,而不是絕對的束縛。
    然後就是可維護性,如果工廠的創建方法需要進行修改,簡單工廠只需要修改一個類的相關代碼,工廠模式則可能需要修改很多類的相關代碼,操作會變得相當繁瑣和麻煩。
    所以,根據設計理論建議:工廠方法模式,但是在實際中一般會使用簡單工廠模式。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章