1、定义
(Factory Method)定义一个用于创建对象的接口,让之类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其之类。
2、使用场景
加减乘除运算,延续简单工厂模式继续封装。
3、代码结构UML图
抽象工厂:将工厂抽象出来一个接口;
加法工厂:具体的工厂类;
运算类:运算操作抽象类;
加减乘除类:具体的运算类。
4、类的实现
(1)、AddFactory、SubFactory 、OperationMul、OperationDiv ( 具体工厂类)
public class AddFactory implements IFactory {
@Override
public Operation createOperation() {
return new OperationAdd();
}
}
public class SubFactory implements IFactory {
@Override
public Operation createOperation() {
return new OperationSub();
}
}
public class OperationMul extends Operation {
@Override
public double getResult() {
double result = 0;
result = getNumberA() * getNumberB();
return result;
}
}
public class OperationDiv extends Operation {
@Override
public double getResult() {
double result = getNumberA() / getNumberB();
return result;
}
}
(2)、Operation(运算抽象类)
public class Operation {
private double numberA = 0;
private double numberB = 0;
public double getNumberA() {
return numberA;
}
public void setNumberA(double numberA) {
this.numberA = numberA;
}
public double getNumberB() {
return numberB;
}
public void setNumberB(double numberB) {
this.numberB = numberB;
}
public double getResult() {
double result = 0;
return result;
}
}
(3)、OperationAdd、OperationSub、OperationMul、OperationDiv(具体运算类)
public class OperationAdd extends Operation {
@Override
public double getResult() {
double result = 0;
result = getNumberA() + getNumberB();
return result;
}
}
public class OperationSub extends Operation {
@Override
public double getResult() {
double result = 0;
result = getNumberA() - getNumberB();
return result;
}
}
public class OperationMul extends Operation {
@Override
public double getResult() {
double result = 0;
result = getNumberA() * getNumberB();
return result;
}
}
public class OperationDiv extends Operation {
@Override
public double getResult() {
double result = getNumberA() / getNumberB();
return result;
}
}
5、客户端调用
public static void main(String[] args) {
IFactory mulFactory = new MulFactory();
Operation operation = mulFactory.createOperation();
operation.setNumberA(1);
operation.setNumberB(2);
double result=operation.getResult();
System.out.println("计算结果:"+result);
}
输出:
6、总结
工厂方法模式实现时,客户端需要觉得实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。你想要加功能,本来是改工厂类的,而现在是修改客户端。
参考:《大话设计模式》