java之工厂模式

1.题目

    请编写一个计算器,看似题目简单,有深坑哦

初学者的写法:

    Scanner read=new Scanner(System.in);
    ....println("请输入第一个数:");
    num1=....nextInt();
    ....println("请输入符号位:");
    operater=....next();
    ....println("请输入第二个数:");
    num2=....nextInt();
    int result =0;
    switch(operater){
        ......
    }
    println("结果为:"+result);

指出问题:

    一:页面与逻辑混为一谈
    二:比如说我要添加新需求,此时就需要添加case分支,导致其他运算逻辑暴露

解决问题1:
将页面与运算逻辑剥离出来
创建一个Operation类,其中有个静态成员方法 进行运行
Operation类

        public static getResult(int num1,String opreate,int num2){
            int result =0;
            switch(operater){
                ......
            }
            return result;
        }

主类

        Scanner read=new Scanner(System.in);
        ....println("请输入第一个数:");
        num1=....nextInt();
        ....println("请输入符号位:");
        operater=....next();
        ....println("请输入第二个数:");
        num2=....nextInt();
        int result=Operation.getResult(num1,operater,num2);
        ...println(result);

注意:到此为止已经将页面与逻辑代码分离,这时如果说只需要添加其他运算符,只需要改运算类,不涉及页面! (此时用到了java 的三大特性之一 封装)

解决问题2:
通过继承多态两大特性 解决添加修改算法不需要暴露其他算法的问题
考虑 可以通过继承 让算法逻辑实现Operation类 这样运算添加只需继承Operation类 自定义运算逻辑就可以 删除直接删除子类 ,这就是所谓的低耦合

修改operation为abstract类(为何非要定义成abstract类,请了解下百度,本人语言组织能力有限,,,,)

定义两个私有化变量,提供getset方法,在提供一个公用abstract的getresult方法,用于自定义运算逻辑并返回

Operation类

    //数字1
    private int num1;
    //数字2
    private int num2;

    public int getNum1() {
        return num1;
    }
    public void setNum1(int num1) {
        this.num1 = num1;
    }
    public int getNum2() {
        return num2;
    }
    public void setNum2(int num2) {
        this.num2 = num2;
    }

    /**
     * 获取结果
     * @return
     */
    public abstract int getResult();

SumOperater类

@Override
public int getResult() {
    int result=getNum1()+getNum2();
    return result;
}

SubOperation类

@Override
public int getResult() {
    int result=getNum1()-getNum2();
    return result;
}

此时虽然通过继承实现了分离,但却无法知道使用了哪个运算符,通过工厂设计模式结合多态可以实现.不同的operate实例不同的对象,

首选创建一个工厂类
OperationFactory

public static Operation createOperation(String operate){
    Operation operation=null;
    switch (operate) {
    case "+":
        operation=new SumOperation();
        break;
    case "-":
        operation=new SubOperation();
        break;
    default:
        break;
    }
    return operation;
}

主类

Scanner scanner=new Scanner(System.in);
    System.out.println("请输入第一个数:");
    int num1 = scanner.nextInt();
    System.out.println("请输入符号位:");
    String operate = scanner.next();
    System.out.println("请输入第二个数:");
    int num2 = scanner.nextInt();
    Operation createOperation = OperationFactory.createOperation(operate);
    createOperation.setNum1(num1);
    createOperation.setNum2(num2);
    int result = createOperation.getResult();
    System.out.println(result);

到此,工厂设计模式就讲解完毕!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值