简单工厂模式示例


/**
 * @version 1.0
 *          初版代码,只能实现功能,问题很多
 */
public class Test {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        MyUtils.print("请输入数字a:");
        String a = scanner.nextLine();
        MyUtils.print("请选择运算符号(+,-,*,/):");
        String sign = scanner.nextLine();
        MyUtils.print("请输入数字b:");
        String b = scanner.nextLine();
        String result = "";

        if ("+".equals(sign)) {
            result = String.valueOf(Double.parseDouble(a) + Double.parseDouble(b));
        } else if ("-".equals(sign)) {
            result = String.valueOf(Double.parseDouble(a) - Double.parseDouble(b));
        } else if ("*".equals(sign)) {
            result = String.valueOf(Double.parseDouble(a) * Double.parseDouble(b));
        } else if ("/".equals(sign)) {
            result = String.valueOf(Double.parseDouble(a) / Double.parseDouble(b));
        }

        MyUtils.print("结果是:" + result);
    }
}

/**
 * @version 1.1
 *          修改:<br>
 *          1.规范变量名
 *          2.对除数0做异常判断
 *          问题:<br>
 *          1.没有面向对象
 *          2.没有业务逻辑和界面分离
 *          3.扩展性差,可维护差
 */
public class Test {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        MyUtils.print("请输入数字A:");
        String strNumberA = scanner.nextLine();
        MyUtils.print("请选择运算符号(+,-,*,/):");
        String strOperate = scanner.nextLine();
        MyUtils.print("请输入数字B:");
        String strNumberB = scanner.nextLine();
        String result = "";

        try {
            switch (strOperate) {
                case "+":
                    result = String.valueOf(Double.parseDouble(strNumberA) + Double.parseDouble(strNumberB));
                    break;
                case "-":
                    result = String.valueOf(Double.parseDouble(strNumberA) - Double.parseDouble(strNumberB));
                    break;
                case "*":
                    result = String.valueOf(Double.parseDouble(strNumberA) * Double.parseDouble(strNumberB));
                    break;
                case "/":
                    if (Double.compare(Double.parseDouble(strNumberB), 0) == 0) {
                        throw new IllegalArgumentException("除数不能为0");
                    }
                    result = String.valueOf(Double.parseDouble(strNumberA) / Double.parseDouble(strNumberB));
                    break;
            }
            MyUtils.print("结果是:" + result);
        } catch (IllegalArgumentException e) {
            MyUtils.print(e.getMessage());
        }
    }
}

/**
 * @version 1.2
 *          修改:<br>
 *          1.业务与界面分离
 *          2.对运算过程进行封装
 *          问题:<br>
 *          1.如果要增加运算功能,需要修改Operation类,违背了开闭原则
 */
public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        MyUtils.print("请输入数字A:");
        String strNumberA = scanner.nextLine();
        MyUtils.print("请选择运算符号(+,-,*,/):");
        String strOperate = scanner.nextLine();
        MyUtils.print("请输入数字B:");
        String strNumberB = scanner.nextLine();

        try {
            String result = String.valueOf(Operation.getResult(Double.parseDouble(strNumberA),
                    Double.parseDouble(strNumberB), strOperate));
            MyUtils.print(result);
        } catch (Exception e) {
            MyUtils.print("输入错误:" + e.getMessage());
        }

    }
}
/**
 * 封装运算,获得结果
 */
public class Operation {
    public static double getResult(double numberA, double numberB, String operate) {
        double result = 0;
        switch (operate) {
            case "+":
                result = numberA + numberB;
                break;
            case "-":
                result = numberA - numberB;
                break;
            case "*":
                result = numberA * numberB;
                break;
            case "/":
                if (Double.compare(numberB, 0) == 0) {
                    throw new IllegalArgumentException("除数为0");
                }
                result = numberA / numberB;
                break;
        }
        return result;
    }
}

/**
 * @version 1.3
 */
public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        MyUtils.print("请输入数字A:");
        String strNumberA = scanner.nextLine();
        MyUtils.print("请选择运算符号(+,-,*,/):");
        String strOperate = scanner.nextLine();
        MyUtils.print("请输入数字B:");
        String strNumberB = scanner.nextLine();

        try {
            Operation operation = OperationFactory.createOperate(strOperate);
            operation.setNumberA(Double.parseDouble(strNumberA));
            operation.setNumberB(Double.parseDouble(strNumberB));
            MyUtils.print("结果是:" + operation.getResult());
        } catch (Exception e) {
            MyUtils.print(e.getMessage());
        }
    }
}
/**
 * 工厂类
 */
public class OperationFactory {

    public static Operation createOperate(String operate) {
        Operation operation=null;
        switch (operate) {
            case "+":
                operation = new OperationAdd();
                break;
            case "-":
                operation = new OperationSub();
                break;
            case "*":
                operation = new OperationMul();
                break;
            case "/":
                operation = new OperationDiv();
                break;
        }
        return operation;
    }
}
/**
 * 抽象的操作类
 */
public abstract class Operation {
    private double numberA;
    private double numberB;

    /**
     * 获得运算结果
     */
    public abstract double getResult();

    public double getNumberA() {
        return numberA;
    }

    public void setNumberA(double numberA) {
        this.numberA = numberA;
    }

    public double getNumberB() {
        return numberB;
    }

    public void setNumberB(double numberB) {
        this.numberB = numberB;
    }
}
/**
 * 加法
 */
public class OperationAdd extends Operation {

    @Override
    public double getResult() {
        return getNumberA() + getNumberB();
    }
}
/**
 * 减法
 */
public class OperationSub extends Operation {
    @Override
    public double getResult() {
        return getNumberA() - getNumberB();
    }
}
/**
 * 乘法
 */
public class OperationMul extends Operation {
    @Override
    public double getResult() {
        return getNumberA() * getNumberB();
    }
}
/**
 * 除法
 */
public class OperationDiv extends Operation {
    @Override
    public double getResult() {
        if (Double.compare(getNumberB(), 0) == 0) {
            throw new IllegalArgumentException("除数不能为0");
        }
        return getNumberA() / getNumberB();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值