工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。
工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
下图为计算器程序的工厂方法模式的UML图结构:
下面为计算器程序的工厂方法模式的代码实现:
//运算类的抽象类 abstract class Operation { private double numberA = 0; private double numberB = 0; public void setNumberA(double numberA) { this.numberA = numberA; } public double getNumberA() { return numberA; } public void setNumberB(double numberB) { this.numberB = numberB; } public double getNumberB() { return numberB; } public abstract double getResult(); } //加法类 public class Add extends Operation { @Override public double getResult() { return getNumberA() + getNumberB(); } } //减法类 public class Sub extends Operation { @Override public double getResult() { return getNumberA() - getNumberB(); } } //乘法类 public class Mul extends Operation { @Override public double getResult() { return getNumberA() * getNumberB(); } } //除法类 public class Div extends Operation { @Override public double getResult() { if (getNumberB() == 0) return 0; return getNumberA() / getNumberB(); } } //工厂接口 interface IFactory { Operation createOperation(); } //加法类工厂 public class AddFactory implements IFactory { @Override public Operation createOperation() { return new Add(); } } //减法类工厂 public class SubFactory implements IFactory { @Override public Operation createOperation() { return new Sub(); } } //乘法类工厂 public class MulFactory implements IFactory { @Override public Operation createOperation() { return new Mul(); } } //除法类工厂 public class DivFactory implements IFactory { @Override public Operation createOperation() { return new Div(); } } //客户端代码 public class Main { public static void main(String[] args) { IFactory factory1 = new AddFactory(); Operation operation1 = factory1.createOperation(); operation1.setNumberA(2.0); operation1.setNumberB(3.0); System.out.println(operation1.getResult()); IFactory factory2 = new SubFactory(); Operation operation2 = factory2.createOperation(); operation2.setNumberA(2.0); operation2.setNumberB(3.0); System.out.println(operation2.getResult()); IFactory factory3 = new MulFactory(); Operation operation3 = factory3.createOperation(); operation3.setNumberA(2.0); operation3.setNumberB(3.0); System.out.println(operation3.getResult()); IFactory factory4 = new DivFactory(); Operation operation4 = factory4.createOperation(); operation4.setNumberA(2.0); operation4.setNumberB(3.0); System.out.println(operation4.getResult()); } }客户端结果截图:
下图为简单工厂方法模式的计算器程序UML图:
下图为工厂方法模式的计算器程序UML图: 通过对比两张UML图我们可以发现如下区别:
简单工厂模式在工厂类中包含了必要的逻辑判断(例如:决定要实例化加法类还是减法类) ,当添加其他运算类的时候,需要修改工厂类,这违背了开放-封闭原则(开放-封闭原则就是避免修改已存在的类,尽量通过扩展类来达到修改的目的)。工厂方法实现时,由客户端决定实例化哪一个工厂来实现运算类,这样就不用修改已存在的类了(客户端代码暂不归属于功能类,上面说的避免修改已存在的类是指功能类),例如,当需要添加平方运算类的时候,只需要平方运算类继承运算类,平方工厂实现工厂类,然后修改客户端就可以了,这样就避免了修改已存在的类以及类的结构。