工厂模式三部曲之简单工厂模式

今天,我们来谈一谈工厂模式三部曲之一——简单工厂模式(静态工厂模式)。
首先,先谈一下工厂模式吧,工厂模式根据抽象程度的不同划分为三种:简单工厂模式,工厂方法模式以及抽象工厂模式。它是编程中经常用到的一种模式哦。那么为什么这么受欢迎呢?
1.可以使代码清晰,有效地封装变化。通过工厂模式将产品的实例化封装起来,调用者无需关心产品的实例化过程,只需要依赖工厂即可得到自己想要的产品。
2.降低耦合度。产品类的实例化通常需要依赖很多的类,而这些类对于调用者来说根本无需知道,使用了工厂方法,我们需要做的仅仅是实例化好产品类,然后交给调用者使用。对于调用者来说,产品所依赖的类都是透明的。

3.对调用者屏蔽具体的产品类。调用者只关心产品的接口就可以了,至于具体的实现,调用者根本无需关心。即使变更了具体的实现,对调用者来说没有任何的影响。


简单工厂模式,一般具有三个要素,工厂类,产品接口和产品的实现
下面以简单的计算器案例加以说明。

类图如下:

项目目录如下:

三个要素,工厂类是OperationFactory,负责创建产品对象。产品接口是Operation,里面定义了getResult()方法。AddOperation,SubOperation,MulOperation,DivOperation分别是产品的具体实现。代码如下:

Operation:

public abstract class Operation {
    private double number1;
    private double number2;
    public double getNumber1() {
        return number1;
    }
    public void setNumber1(double number1) {
        this.number1 = number1;
    }
    public double getNumber2() {
        return number2;
    }
    public void setNumber2(double number2) {
        this.number2 = number2;
    }
    public abstract double getResult();
}

AddOperation:

public class AddOperation extends Operation {

    @Override
    public double getResult() {
        return getNumber1() + getNumber2();
    }

}

SubOperation:

public class SubOperation extends Operation {

    @Override
    public double getResult() {
        return getNumber1() - getNumber2();
    }

}

MulOperation:

public class MulOperation extends Operation {

    @Override
    public double getResult() {
        return getNumber1() * getNumber2();
    }

}

DivOperation:

public class DivOperation extends Operation {

    @Override
    public double getResult() {
        if("0".equals(getNumber2()+"")){
            throw new RuntimeException("除数不能为0");
        }
        return getNumber1() / getNumber2();
    }

}

OpertionFactory:

public class OperationFactory {
    public static Operation createOperation(String op){
        Operation oper = null;
        switch (op) {
        case "+":
            oper = new AddOperation();
            break;
        case "-":
            oper = new SubOperation();
            break;
        case "*":
            oper = new MulOperation();
            break;
        case "/":
            oper = new DivOperation();
            break;

        default:
            oper = null;
        }
        return oper;
    }
}

 测试:

Operation oper = OperationFactory.createOperation("-");
oper.setNumber1(1);
oper.setNumber2(3.5);
System.out.println(oper.getResult());
原文地址:https://www.cnblogs.com/DarrenChan/p/5661356.html