工厂模式在开发中的应用


  1. 首先在不通过设计模式,实现简单计算器程序,简单代码如下:
    package httpclientutilmaster.httpclientutilmaster.countnumber;
    
    import java.util.Scanner;
    
    /**
     * @ClassName MainClass
     * @Description TODO
     * @Author Feng
     * @Date 2019/3/25 13:49
     * @Version 1.0
     **/
    
    public class MainClass {
        public static void main(String[] args) {
            //在不通过设计模式,实现简单计算器程序
            // 1、接受控制台输入
            System.out.println("*****计算器程序*****");
            System.out.println("输入第一个操作数");
            Scanner scanner = new Scanner(System.in);
            String strNum1 = scanner.nextLine();
    
            System.out.println("输入运算符");
            String opr = scanner.nextLine();
    
            System.out.println("输入第二个操作数");
            String strNum2 = scanner.nextLine();
            double result = 0;
            // 2、进行运算
            if ("+".equals(opr)){
                result = Double.parseDouble(strNum1) + Double.parseDouble(strNum2);
            }else if ("-".equals(opr)){
                result = Double.parseDouble(strNum1) - Double.parseDouble(strNum2);
            }else if ("*".equals(opr)){
                result = Double.parseDouble(strNum1) * Double.parseDouble(strNum2);
            }else if ("/".equals(opr)){
                result = Double.parseDouble(strNum1) / Double.parseDouble(strNum2);
            }
    
            // 3、返回结果
            System.out.println(strNum1 + opr + strNum2 + "=" + result);
    
        }
    
    }


    运行结果:

    *****计算器程序*****
    输入第一个操作数
    5
    输入运算符
    *
    输入第二个操作数
    6
    5*6=30.0

  2. 由于除法运算中,分母不能为零。简单优化后的代码如下:
    public class MainClass {
        public static void main(String[] args) {
            //在不通过设计模式,实现简单计算器程序
            // 1、接受控制台输入
            System.out.println("*****计算器程序*****");
            System.out.println("输入第一个操作数");
            Scanner scanner = new Scanner(System.in);
            String strNum1 = scanner.nextLine();
    
            System.out.println("输入运算符");
            String opr = scanner.nextLine();
    
            System.out.println("输入第二个操作数");
            String strNum2 = scanner.nextLine();
            double result = 0;
            // 2、进行运算
            if ("+".equals(opr)){
                result = Double.parseDouble(strNum1) + Double.parseDouble(strNum2);
            }else if ("-".equals(opr)){
                result = Double.parseDouble(strNum1) - Double.parseDouble(strNum2);
            }else if ("*".equals(opr)){
                result = Double.parseDouble(strNum1) * Double.parseDouble(strNum2);
            }else if ("/".equals(opr)){
                if (Double.parseDouble(strNum2) == 0d){
                    throw new java.lang.ArithmeticException("分母不能为零");
                }else{
                result = Double.parseDouble(strNum1) / Double.parseDouble(strNum2);}
            }
    
            // 3、返回结果
            System.out.println(strNum1 + opr + strNum2 + "=" + result);
    
        }
    
    }
  3. 以上的代码有哪些缺陷
    缺点:完全的面向过程设计,缺少代码重用。(比如,增加求平方等等)
  4. 用面向对象思想实现
    package httpclientutilmaster.httpclientutilmaster.countnumber;
    
    /**
     * @ClassName Operation
     * @Description TODO
     * @Author Feng
     * @Date 2019/3/25 14:53
     **/
    
    public abstract class Operation {
    
        private double num1;
        private double num2;
    
        public double getNum1() {
            return num1;
        }
    
        public void setNum1(double num1) {
            this.num1 = num1;
        }
    
        public double getNum2() {
            return num2;
        }
    
        public void setNum2(double num2) {
            this.num2 = num2;
        }
    
        public abstract double getResult();
    }
    
    
     
    package httpclientutilmaster.httpclientutilmaster.countnumber;
    
    /**
     * @ClassName AddOperation
     * @Description TODO
     * @Author Feng
     * @Date 2019/3/25 14:55
     **/
    
    public class AddOperation extends Operation {
        @Override
        public double getResult() {
            double result = this.getNum1() + this.getNum2();
            return result;
        }
    }
    
    
     
    package httpclientutilmaster.httpclientutilmaster.countnumber;
    
    import java.util.Scanner;
    
    /**
     * @ClassName MainClass
     * @Description TODO
     * @Author Feng
     * @Date 2019/3/25 13:49
     * @Version 1.0
     **/
    
    public class MainClass {
        public static void main(String[] args) {
            //在不通过设计模式,实现简单计算器程序
            // 1、接受控制台输入
            System.out.println("*****计算器程序*****");
            System.out.println("输入第一个操作数");
            Scanner scanner = new Scanner(System.in);
            String strNum1 = scanner.nextLine();
    
            System.out.println("输入运算符");
            String opr = scanner.nextLine();
    
            System.out.println("输入第二个操作数");
            String strNum2 = scanner.nextLine();
            double result = 0;
            double num1 = Double.parseDouble(strNum1);
            double num2 = Double.parseDouble(strNum2);
            // 2、进行运算,大家可以看到加法运算中,还需要知道,new实例化一个AddOperation,我们不希望使用实例化,那么就用工厂模式来实现。
            if ("+".equals(opr)){
                Operation addOperation = new AddOperation();
                addOperation.setNum1(num1);
                addOperation.setNum2(num2);
                result = addOperation.getResult();
            }else if ("-".equals(opr)){
                result = Double.parseDouble(strNum1) - Double.parseDouble(strNum2);
            }else if ("*".equals(opr)){
                result = Double.parseDouble(strNum1) * Double.parseDouble(strNum2);
            }else if ("/".equals(opr)){
                if (Double.parseDouble(strNum2) == 0d){
                    throw new java.lang.ArithmeticException("分母不能为零");
                }else{
                result = Double.parseDouble(strNum1) / Double.parseDouble(strNum2);}
            }
    
            // 3、返回结果
            System.out.println(strNum1 + opr + strNum2 + "=" + result);
    
        }
    
    }
    
  5. 简单工厂模式实现
    package httpclientutilmaster.httpclientutilmaster.countnumber;
    
    /**
     * @ClassName OperationFactory
     * @Description TODO
     * @Author Feng
     * @Date 2019/3/25 15:58
     **/
    
    public class OperationFactory {
        public static Operation getOperation(String opr){
            if ("+".equals(opr)){
                return new AddOperation();
            }
            return null;
        }
    }
    package httpclientutilmaster.httpclientutilmaster.countnumber;
    
    import java.util.Scanner;
    
    /**
     * @ClassName MainClass
     * @Description TODO
     * @Author Feng
     * @Date 2019/3/25 13:49
     * @Version 1.0
     **/
    
    public class MainClass {
        public static void main(String[] args) {
            //在不通过设计模式,实现简单计算器程序
            // 1、接受控制台输入
            System.out.println("*****计算器程序*****");
            System.out.println("输入第一个操作数");
            Scanner scanner = new Scanner(System.in);
            String strNum1 = scanner.nextLine();
    
            System.out.println("输入运算符");
            String opr = scanner.nextLine();
    
            System.out.println("输入第二个操作数");
            String strNum2 = scanner.nextLine();
            double result = 0;
            double num1 = Double.parseDouble(strNum1);
            double num2 = Double.parseDouble(strNum2);
            // 2、进行运算,后续我们只需要修改工厂类,客户端MainClass不需要任何修改了。
            Operation operation = OperationFactory.getOperation(opr);
            operation.setNum1(num2);
            operation.setNum2(num1);
            result = operation.getResult();
    
            // 3、返回结果
            System.out.println(strNum1 + opr + strNum2 + "=" + result);
    
        }
    
    }

    同理减法运算代码:

    package httpclientutilmaster.httpclientutilmaster.countnumber;
    
    /**
     * @ClassName SubOperation
     * @Description TODO
     * @Author Feng
     * @Date 2019/3/25 16:05
     * 同理减法运算
     **/
    
    public class SubOperation extends Operation {
        @Override
        public double getResult() {
            double result = this.getNum1() - this.getNum2();
            return result;
        }
    }

    我们只需要修改OperationFactory判断逻辑即可:

    public class OperationFactory {
        public static Operation getOperation(String opr){
            if ("+".equals(opr)){
                return new AddOperation();
            }else if ("-".equals(opr)){
                return new SubOperation();
            }
            return null;
        }
    }
  6. OperationFactory实际上是一个具体的实现类。我们可以优化如下。
    // OperationFactory修改为接口 

    public interface OperationFactory {
    public Operation getOperation(String opr); }
    package httpclientutilmaster.httpclientutilmaster.countnumber;
    
    /**
     * @ClassName AddOperationFactory
     * @Description TODO
     * @Author Feng
     * @Date 2019/3/25 16:36
     **/
    
    public class AddOperationFactory implements OperationFactory {
        @Override
        public Operation getOperation() {
            return new AddOperation();
        }
    }
    
    
     
    package httpclientutilmaster.httpclientutilmaster.countnumber;
    
    import java.util.Scanner;
    
    /**
     * @ClassName MainClass
     * @Description TODO
     * @Author Feng
     * @Date 2019/3/25 13:49
     * @Version 1.0
     **/
    
    public class MainClass {
        public static void main(String[] args) {
            //在不通过设计模式,实现简单计算器程序
            // 1、接受控制台输入
            System.out.println("*****计算器程序*****");
            System.out.println("输入第一个操作数");
            Scanner scanner = new Scanner(System.in);
            String strNum1 = scanner.nextLine();
    
            System.out.println("输入运算符");
            String opr = scanner.nextLine();
    
            System.out.println("输入第二个操作数");
            String strNum2 = scanner.nextLine();
            double result = 0;
            double num1 = Double.parseDouble(strNum1);
            double num2 = Double.parseDouble(strNum2);
            // 2、进行运算,好处在于增加其他运算规则的情况下,我们只需要增加相应的AddOperationFactory/AddOperation
    
            if ("+".equals(opr)){
                AddOperationFactory addOperationFactory = new AddOperationFactory();
                Operation operation = addOperationFactory.getOperation();
                operation.setNum1(num1);
                operation.setNum2(num2);
                result = operation.getResult();
            }
    
            // 3、返回结果
            System.out.println(strNum1 + opr + strNum2 + "=" + result);
    
        }
    
    }
    


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM