定义:
定义一个接口,让创建对象延伸到子类,工厂方法让实例化延伸到子类。
简单工厂VS工厂模式:
简单工厂类最大的有点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件,动态的实例化相关的类,对于客户端来说,去除了与具体产品的实现。
简单工厂类中,我们采用的是计算器的Demo,我们的计算器实现了加减乘除,如果这时,我们想给我们计算器增加一个开方的功能的,我们需要修改工厂类,这个时候,我们就违背了我们的设计原则开放封闭原则了。
我们采取一个措施,把原来的工厂类,根据依赖倒转原则,抽象出来,成为一个接口。这个接口,不去关心如何创建对象,仅仅给实现的的子类提供必须要实现的功能。
UML图:
老规矩,代码中参悟。
Demo:
根据简单工厂模式的中的Demo的改版。
Operation:
public abstract class Operation { int FirstNum; int SecondNum; public int getFirstNum() { return FirstNum; } public void setFirstNum(int firstNum) { FirstNum = firstNum; } public int getSecondNum() { return SecondNum; } public void setSecondNum(int secondNum) { SecondNum = secondNum; } public abstract int getResult() throws Exception; }
OperationImpl:
//加法 class OperationAddImpl extends Operation { @Override public int getResult() { return FirstNum + SecondNum; } } //除法 class OperationDivImpl extends Operation { @Override public int getResult() throws Exception { if (SecondNum == 0) { throw new Exception("被除数不能为0"); } else { return FirstNum / SecondNum; } } } //减法 class OperationSubImpl extends Operation { @Override public int getResult() { return FirstNum - SecondNum; } } //乘法 class OperationMulDivImpl extends Operation { @Override public int getResult() { return FirstNum * SecondNum; } }
Factory:
public interface Factory { public Operation create(); }
FactoryImpl:
class FactoryAdd implements Factory { @Override public Operation create() { return new OperationAddImpl(); } } class FactorySub implements Factory { @Override public Operation create() { return new OperationSubImpl(); } } class FactoryMulDiv implements Factory { @Override public Operation create() { return new OperationMulDivImpl(); } } class FactoryDiv implements Factory { @Override public Operation create() { return new OperationMulDivImpl(); } }
Client:
public class Client { public static void main(String[] args) throws Exception { Factory factory = new FactoryAdd(); Operation oper = factory.create(); oper.setFirstNum(10); oper.setSecondNum(2); System.out.println(oper.getResult()); } }
总结:
工厂模式是从简单工厂模式衍生出来的,解决了简单工厂模式存在一些问题,例如解决了简单工厂违反开放封闭原则的问题。