工厂方法模式
why 工厂方法模式?
简单工厂模式违背了开放封闭原则(开放了拓展,也开放了修改),如果需要增加功能就需要在工厂类中修改逻辑判断,于是工厂方法模式应运而生。
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到子类。
案例
类图:
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() throws Exception{
double result = 0;
return result;
}
}
class Add extends Operation{
public double getResult()
{
double result = 0;
result = getNumberA() + getNumberB();
return result;
}
}
class Sub extends Operation{
public double getResult()
{
double result = 0;
result = getNumberA() - getNumberB();
return result;
}
}
class Mul extends Operation{
public double getResult()
{
double result = 0;
result = getNumberA() * getNumberB();
return result;
}
}
class Div extends Operation{
public double getResult() throws Exception
{
double result = 0;
if (getNumberB() == 0){
throw new Exception("除数不能为0");
}
result = getNumberA() / getNumberB();
return result;
}
}
//定义一个用于创建对象的接口
interface IFactory
{
Operation createOperation();
}
class AddFactory implements IFactory{
@Override
public Operation createOperation() {
return new Add();
}
}
class SubFactory implements IFactory{
@Override
public Operation createOperation() {
return new Add();
}
}
class MulFactory implements IFactory{
@Override
public Operation createOperation() {
return new Add();
}
}
class DivFactory implements IFactory{
@Override
public Operation createOperation() {
return new Add();
}
}
public class FactoryMethodPatternTest {
public static void main(String[] args) throws Exception {
IFactory operFactory = new AddFactory();
Operation oper = operFactory.createOperation();
oper.setNumberA(1);
oper.setNumberB(2);
double result = oper.getResult();
System.out.println(result);
}
}
在使用工厂方法模式的情况下,如果我们要增加新的功能,比如说现在要增加一个求余操作,我们只需在上面代码的基础上增加两个类,即可实现。
class Mod extends Operation{
public double getResult(){
double result = 0;
result = getNumberA() % getNumberB();
return result;
}
}
class ModFactory implements IFactory{
@Override
public Operation createOperation() {
return new Mod();
}
}