四則運算法則表延伸 - 工廠方法模式

工廠方法模式

簡介

定義了一個建立對象的抽象方法,由子類決定要實例化的類java

工廠方法的模式將對象的實例化推遲到子類算法

輸入圖片說明

組成角色

  • 抽象工廠角色: 這是工廠方法模式的核心,它與應用程序無關。是具體工廠角色必須實現的接口或者必須繼承的父類。在java中它由抽象類或者接口來實現。
  • 具體工廠角色:它含有和具體業務邏輯有關的代碼。由應用程序調用以建立對應的具體產品的對象。在java中它由具體的類來實現。
  • 抽象產品角色:它是具體產品繼承的父類或者是實現的接口。在java中通常有抽象類或者接口來實現。
  • 具體產品角色:具體工廠角色所建立的對象就是此角色的實例。在java中由具體的類來實現。

優缺點

  • 優勢ide

    • 一個調用者想建立一個對象,只要知道其名稱就能夠了。
    • 擴展性高,若是想增長一個產品,只要擴展一個工廠類就能夠。
    • 屏蔽產品的具體實現,調用者只關心產品的接口。
  • 缺點設計

    • 每次增長一個產品時,都須要增長一個具體類和對應的實現工廠,使得系統中類的個數成倍增長,在必定程度上增長了系統的複雜度,同時也增長了系統具體類的依賴。

適用場景

  • 當一個類不知道它所必須建立的對象的類的時候。
  • 當一個類但願由它的子類來指定它所建立的對象的時候。
  • 當類將建立對象的職責委託給多個幫助子類中的某一個,而且你但願將哪個幫助子類是代理者這一信息局部化的時候。

注意事項

  • 做爲一種建立類模式,在任何須要生成複雜對象的地方,均可以使用工廠方法模式。有一點須要注意的地方就是複雜對象適合使用工廠模式,而簡單對象,特別是只須要經過 new 就能夠完成建立的對象,無需使用工廠模式。若是使用工廠模式,就須要引入一個工廠類,會增長系統的複雜度。

案例

四則運算表

大牛:「小鳥,你又沒有發現,使用簡單工廠去設計四則運算表的時候,其實對於LowTableFactory類來講是違背了開閉原則的。」代理

小鳥:「發現了,若是我要增長其它的算法表的類,那麼同時我也要去修改LowTableFactory類,給其添加一個case。」code

大牛:「說的不錯,對於這個問題,你有什麼好的解決思路呢?」orm

小鳥:「個人解決方法就是,使用工廠方法模式,如下就是個人代碼(以加法表和乘法表爲例)」對象

抽象產品角色:AFourOperations繼承

四則運算法則接口

public abstract class AFourOperations {
    public abstract void operations();
}

具體產品角色1:AddOperations

加法表

public class AddOperations extends AFourOperations {

    @Override
    public void operations() {
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print(String.format("%d+%d=%d\t", j, i, i + j));
            }
            System.out.println("");
        }
    }
}

具體產品角色2:MultiplicationOperations

乘法表

public class MultiplicationOperations extends AFourOperations {
    @Override
    public void operations() {
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print(String.format("%d*%d=%d\t", j, i, i * j));
            }
            System.out.println("");
        }
    }
}

抽象工廠角色:IFourOperationsFactory

工廠類

public abstract class AFourOperationsFactory {
    public abstract AFourOperations createFourOperations();
}

具體工廠角色1:AddOperationsFactory

加法工廠

public class AddOperationsFactory extends AFourOperationsFactory {

    @Override
    public AFourOperations createFourOperations() {
        return new AddOperations();
    }
}

具體工廠角色2:MultiplicationOperationsFactory

乘法工廠

public class MultiplicationOperationsFactory extends AFourOperationsFactory {
    @Override
    public AFourOperations createFourOperations() {
        return new MultiplicationOperations();
    }
}

客戶端調用

AFourOperationsFactory factory = new MultiplicationOperationsFactory();
AFourOperations aFourOperations = factory.createFourOperations();
aFourOperations.operations();

大牛:「嗯嗯,不錯,結構很清晰!」

小鳥:「牛哥,我發現這個還不如簡單工廠好用呢!這裏每建立一個類,就得爲其建立對應的工廠,感受無形中增長了好多類啊!

大牛:「確實,這就是工廠方法模式和簡單工廠的一個最大區別,工廠方法模式雖然增長了不少類,但它更符合開-閉原則,下降了客戶端與後臺的耦合度

相關文章
相關標籤/搜索