设计模式之工厂模式

来源:互联网 发布:网络结婚主持台词 编辑:程序博客网 时间:2024/06/03 12:56

初始例子

运算类基类:

public abstract class Operation {    protected float numberA;    protected float numberB;    public float getNumberA() {        return numberA;    }    public void setNumberA(float numberA) {        this.numberA = numberA;    }    public float getNumberB() {        return numberB;    }    public void setNumberB(float numberB) {        this.numberB = numberB;    }    abstract float getResult() throws Exception;}

加法运算类:

public class OperationAdd extends Operation {    @Override    float getResult() {        return numberA + numberB;    }}

除法运算类:

public class OperationDiv extends Operation {    @Override    float getResult() throws Exception {        if (numberB == 0) {            throw new Exception("除数不能为0");        }        return numberA / numberB;    }}

简单工厂模式

定义好继承关系之后,考虑的问题就是如何去实例化了,可以定义一个工厂类,传入区分参数,返回需要的实例。

public class OperationFactory {    public static Operation createOperation(String operator) {        switch (operator) {        case "+":            return new OperationAdd();        case "-":            return new OperationSub();        case "x":            return new OperationMul();        case "/":            return new OperationDiv();        default:            return null;        }    }}

然后就可以去获取结果了:

float numberA = Float.parseFloat(numA);float numberB = Float.parseFloat(numB);Operation operation = OperationFactory.createOperation(operator);operation.setNumberA(numberA);operation.setNumberB(numberB);float result = operation.getResult();

简单工厂方法就是创建一个新的工厂类,由这个工厂类决定具体功能实现类的实例化选择,客户端只负责传递参数。
此时业务逻辑判断是在简单工厂类中进行的,但是如果需要添加功能,就需要修改工厂类的原有代码,违反了对扩展开放,对修改封闭的原则。

工厂方法模式

工厂方法模式是给创建一个工厂基类,然后为每个具体功能实现类都创建一个工厂实现类。具体实现类的实例化由客户端实现,使用多态特性调用统一的工厂基类方法获取实际功能实现类。

简单工厂类与分支耦合度高,根据依赖倒转原则,从简单工厂类中抽象出一个创建功能类的抽象方法,就降低了耦合。

所以工厂方法模式相当于把简单工厂模式的实例化任务分派给工厂实现类,由调用方决定实现哪个工厂类。

工厂方法模式因为封装了创建功能类的方法,所以可以使用同个工厂实现类创建多个功能类。

客户端所调用的是接口的方法,不需要具体了解实例化过程。

抽象工厂模式

是工厂方法模式的多产品情况,增加一个新产品的基类,以及具体实现类,原有工厂基类中添加获取新产品的抽象方法,各工厂实现类去具体实例化新产品。

抽象工厂模式可以很方便地修改产品系列的不同实现,但是缺点就是每增加一种新产品,则需要增加一个产品基类,以及多个实现类,还需要修改工厂基类和工厂实现类。

简单工厂模式改进

简单工厂模式实例化的方法改为不从客户端接收参数,直接从配置文件中获取,利用反射获取实例化对象,消除if-else或者switch语句。

原创粉丝点击