1.什么是工厂方法模式?
工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。
2.工厂方法模式的作用?
工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
3.UML图
下图为计算器程序的工厂方法模式的UML图结构:
4.工厂方法模式实现
下面为计算器程序的工厂方法模式的代码实现:
//运算类的抽象类
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());
}
}
客户端结果截图:
5.简单工厂vs工厂方法
下图为简单工厂方法模式的计算器程序UML图:
下图为工厂方法模式的计算器程序UML图:
通过对比两张UML图我们可以发现如下区别:
- 简单工厂模式在工厂类中包含了必要的逻辑判断(例如:决定要实例化加法类还是减法类) ,当添加其他运算类的时候,需要修改工厂类,这违背了开放-封闭原则(开放-封闭原则就是避免修改已存在的类,尽量通过扩展类来达到修改的目的)。
- 工厂方法实现时,由客户端决定实例化哪一个工厂来实现运算类,这样就不用修改已存在的类了(客户端代码暂不归属于功能类,上面说的避免修改已存在的类是指功能类),例如,当需要添加平方运算类的时候,只需要平方运算类继承运算类,平方工厂实现工厂类,然后修改客户端就可以了,这样就避免了修改已存在的类以及类的结构。