工廠模式在開發中的應用


  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