定义了一个建立对象的抽象方法,由子类决定要实例化的类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();
大牛:“嗯嗯,不错,结构很清晰!”
小鸟:“牛哥,我发现这个还不如简单工厂好用呢!这里每建立一个类,就得为其建立对应的工厂,感受无形中增长了好多类啊!
”
大牛:“确实,这就是工厂方法模式和简单工厂的一个最大区别,工厂方法模式虽然增长了不少类,但它更符合开-闭原则,下降了客户端与后台的耦合度
”