• 设计模式之简单工厂模式


    本博客例子均来自  大话设计模式一书!

    1.首先定一个计算器:

    实现简单的加减乘除

    public class Compute1 {
        public static void main(String args[]) {
            try {
                Scanner sc = new Scanner(System.in);
                String result = "";
                System.out.println("请输入一个数字A");
                int numA = sc.nextInt();
                System.out.println("请输入一个数字B");
                int numB = sc.nextInt();
                sc.nextLine();
                System.out.println("请输入运算符+-*/");
                String Opration = sc.nextLine();
                switch (Opration) {
                case "+":
                    result = String.valueOf(numA + numB);
                    break;
                case "-":
                    result = String.valueOf(numA - numB);
                    break;
                case "*":
                    result = String.valueOf(numA * numB);
                    break;
                case "/":
                    if (numB == 0) {
                        result = "除数不能为0";
                        break;
                    }
                    result = String.valueOf(numA / numB);
                    break;
                default:
                    break;
                }
                System.out.println(result);
            } catch (Exception e) {
                System.out.println("您的输入有误:" + e.getMessage());
            }
        }
    }

    此方法可以实现,但是耦合度高。如果要修改其中的一个操作,就要对整个类进行操作。且不易于复用,如果我要单用加法,或者减法是没法实现的。

    这不是面向对象的特点。首先改造此方法:

    1.2降低耦合度

    public class Compute2 {
        public static double GetResult(double numA,double numB,String operate) {
            double result = 0.00;
            switch(operate) {
                case "+":
                    result = numA + numB;
                    break;
                case "-":
                    result = numA - numB;
                    break;
                case "*":
                    result = numA * numB;
                    break;
                case "/":
                    result = numA / numB;
                    break;
            }
            return result;
        }
    }
    public class Compute2Main {
        public static void main(String args[]) {
            try {
            Compute2 compute2 = new Compute2();
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入一个数字A");
            double numA = sc.nextDouble();
            System.out.println("请输入一个数字B");
            double numB = sc.nextDouble();
            sc.nextLine();
            System.out.println("请输入运算符+-*/");
            String Opration = sc.nextLine();
            double getResult = Compute2.GetResult(numA, numB, Opration);
            System.out.println(getResult);
            }catch(Exception e) {
                System.out.println("检查您的输入是否有误!"+e.getMessage());
            }
        }
    }

    这样分离了业务层和表现层。但是可复用的能力还是不行,达不到面向对象的特点。

    继续改造1.2的代码。分离加减乘除,这样对于每个方法,我们都可以实现复用!!! 

    这才是面向对象的特点啊!

    public interface OperationIn {
        double GetResult(double numA,double numB) throws Exception;
    }
    public class sum implements OperationIn{
        @Override
        public double GetResult(double numA, double numB) throws Exception {
            // TODO Auto-generated method stub
            return numA+numB;
        }
    }
    public class reduce implements OperationIn{
        @Override
        public double GetResult(double numA,double numB) {
            return numA-numB;
        }
    }
    public class cc implements OperationIn {
        @Override
        public double GetResult(double numA,double numB) {
            return numA*numB;
        }
    }
    public class cf implements OperationIn {
        @Override
        public double GetResult(double numA,double numB) throws Exception {
            if(numB==0)
                throw new Exception("除数不能为0");
            return numA/numB;
        }
    }

    复用以后,我们就可以开始建立我们的“工厂了”

    public class OperationFactory {
        public static  OperationIn createOperation(String operate) {
            OperationIn oper = null;
            switch(operate) {
                case "+":
                    oper = new sum();
                    break;
                case "-":
                    oper = new reduce();
                    break;
                case "*":
                    oper = new cc();
                    break;
                case "/":
                    oper = new cf();
            }
            return oper;
        }
    }

    通过运算符号来实现对象的实例化!!

    这样,当我们增加功能的时候只需在工厂增加相应的switch分支即可

    方便,复用,灵活,封装,多态提现的淋漓尽致

    public class Main {
    
        public static void main(String[] args) throws Exception {
            try {
            // TODO Auto-generated method stub
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入一个数字A");
            int numA = sc.nextInt();
            System.out.println("请输入一个数字B");
            int numB = sc.nextInt();
            OperationIn oper;
            oper  = OperationFactory.createOperation("-");
            double result = oper.GetResult(numA, numB);
            System.out.println(result);
            }catch(Exception e) {
                System.out.println(e.getMessage());
            }
        }
    
    }

    uml类图如下

    不忘初心,方得始终,以梦为马,不负韶华
  • 相关阅读:
    MySQL使用DDL语句创建表
    MySQL之删_delete-truncate
    APP安全在线检测
    Linux提权:从入门到放弃
    phpmyadmin新姿势getshell
    一次完整的从webshell到域控的探索之路
    我的WafBypass之道(Misc篇)
    我的WafBypass之道(upload篇)
    我的WafBypass之道(SQL注入篇)
    使用Bitsadmin 命令下载文件
  • 原文地址:https://www.cnblogs.com/newz/p/11910453.html
Copyright © 2020-2023  润新知