victory的博客

长安一片月,万户捣衣声

0%

设计模式 | 工厂方法模式

工厂方法模式

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();
    }
}