victory的博客

长安一片月,万户捣衣声

0%

设计模式 | 简单工厂模式

简单工厂模式

工厂:用一个单独的类来完成创造实例的过程。
案例
类图:

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

//工厂:用一个单独的类来做这个创造实例的过程
class OperationFactory{
    public static Operation createOperate(String operate){
        Operation oper = null;
        
        if(operate.equals("+")){
            oper = new Add();
        }else if(operate.equals("-")){
            oper = new Sub();
        }else if(operate.equals("*")){
            oper = new Mul();
        }else if(operate.equals("/")){
            oper = new Div();
        }
        return oper;
    }
}

public class SimpleFactoryTest {
    public static void main(String[] args) throws Exception {
        Operation oper = OperationFactory.createOperate("+");
        oper.setNumberA(1);
        oper.setNumberB(2);
        double result = oper.getResult();
        System.out.println(result);
    }
}

在使用简单工厂模式的情况下,如果我们要增加新的功能,比如说现在要增加一个求余操作,
我们需要增加一个用于求余运算的类,然后在OperationFactory中增加对于求余运算的逻辑判断,这样的做法违背了
开放封闭原则,即在开放拓展的同时也开放了修改。

class Mod extends Operation{
    public double getResult(){
        double result = 0;
        result = getNumberA() % getNumberB();
        return result;
    }
}

class OperationFactory{
    public static Operation createOperate(String operate){
        ......
        else if(operate.equals("%")){
            oper = new Div();
        }
        ......
    }
}