简单工厂模式

需求

假设我们有个需求是实现加减乘除运算的,需要我们编程代码去实现他。

代码实现

先上代码
操作相关的类

/**
 * 所有运算操作的父类
 * */
interface Operation{
    BigDecimal GetResult(int numA,int numB);
}

/**
 * + 操作
 * */
class OperationAdd implements Operation{
    @Override
    public BigDecimal GetResult(int numA, int numB) {
        return BigDecimal.valueOf(numA+numB);
    }
}

/**
 * - 操作
 * */
class OperationSub implements Operation{
    @Override
    public BigDecimal GetResult(int numA, int numB) {
        return BigDecimal.valueOf(numA-numB);
    }
}

/**
 *  * 操作
 * */
class OperationMul implements Operation{
    @Override
    public BigDecimal GetResult(int numA, int numB) {
        return BigDecimal.valueOf(numA*numB);
    }
}

/**
 *  / 操作
 * */
class OperationDiv implements Operation{
    @Override
    public BigDecimal GetResult(int numA, int numB) {
        return BigDecimal.valueOf(numA/numB);
    }
}

工厂类

/**
 * 工厂类
 * */
public class Factory {

    /**
     * 根据传入的运算符,返回相对应的对象
     * */
    public static Operation getInstance(String operationStr) throws Exception {
        Operation operation;
        switch (operationStr){
            case "+":
                operation = new OperationAdd();
                break;
            case "-":
                operation = new OperationSub();
                break;
            case "*":
                operation = new OperationMul();
                break;
            case "/":
                operation = new OperationDiv();
                break;
            default:
                throw new Exception("没有符合的运算");
        }
        return operation;
    }

}

使用示范

public static void main(String[] args){
        Operation operation = null;
        try {
            operation = Factory.getInstance("+");
        } catch (Exception e) {
            e.printStackTrace();
        }
        if(null != operation){
            BigDecimal result = operation.GetResult(1,2);
            System.out.println("结果:"+result);
        }

    }

运行结果
在这里插入图片描述

好处

代码看完了,我们来看看为什么要这样写,明明一个方法能解决的事情为什么要弄出来那么多个类?
我们现在假设有两种情况,一种是全部写在一个方法中,像这样:

public BigDecimal getResult(int numA,int numB,String operationStr) throws Exception {
        switch (operationStr){
            case "+":
                return BigDecimal.valueOf(numA+numB);
            case "-":
                return BigDecimal.valueOf(numA-numB);
            case "*":
                return BigDecimal.valueOf(numA*numB);
            case "/":
                return BigDecimal.valueOf(numA/numB);
            default:
                throw new Exception("没有符合的运算");
        }
    }

我们就称它为A解决方案
自然,简单工厂就是B解决方案

可扩展性

需求:假如我现在需要在加一种运算,如:根号
A解决方案:
怎么做:在getResult方法中增加一个switch分支
好处:方便,直接加就好了
缺点:需要改动已有代码,可能会出现各种问题
B解决方案:
怎么做:新增一个类实现Operation父类,实现GetResult方法,在switch中增加一个分支
好处:不需要对已有的业务代码进行改动
缺点:麻烦,需要新增一个类

可维护性

需求:假如说,我现在需要将 / 运算结果四舍五入取整
A解决方案:
怎么做:在switch的+分支下进行改动
好处:方便
缺点:需要改动已有代码,可能会出现各种问题
B解决方案:
怎么做:到OperationAdd类中,修改代码
好处:不需要对已有的业务代码进行改动
缺点:好像没什么缺点(如果说要去找这个OperationAdd类,麻烦,那也算一个缺点吧)

耦合度

A解决方案:这个看看就知道,全部代码都写在一起,耦合度当然高
B解决方案:分成一个个类,一个个方法,降低了耦合度

总结

可能因为需求太小,很多人还是任务,A的解决方案很不错,但是,正常项目中不可能一个需求两行代码就解决了,需要大量的业务代码,如果全部都写在同一个方法中,到时候找起来就很难找,而且很容易牵一发而动全身,因此,到底哪种方法好,就自己看吧,毕竟打代码只是实现一个功能的方式而已,你也可以用其他方式去实现他。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值