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

今天,我们来谈一谈工厂模式三部曲之一——简单工厂模式(静态工厂模式)。
首先,先谈一下工厂模式吧,工厂模式根据抽象程度的不同划分为三种:简单工厂模式,工厂方法模式以及抽象工厂模式。它是编程中经常用到的一种模式哦。那么为什么这么受欢迎呢?
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值