定義了一個建立對象的抽象方法,由子類決定要實例化的類java
工廠方法的模式將對象的實例化推遲到子類算法
優勢ide
缺點設計
大牛:「小鳥,你又沒有發現,使用簡單工廠去設計四則運算表的時候,其實對於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();
大牛:「嗯嗯,不錯,結構很清晰!」
小鳥:「牛哥,我發現這個還不如簡單工廠好用呢!這裏每建立一個類,就得爲其建立對應的工廠,感受無形中增長了好多類啊!
」
大牛:「確實,這就是工廠方法模式和簡單工廠的一個最大區別,工廠方法模式雖然增長了不少類,但它更符合開-閉原則,下降了客戶端與後臺的耦合度
」