设计模式之简单工厂模式

  简单工厂模式:业务逻辑与界面逻辑分开。

  这样,当业务逻辑发生改变的时候,只需要改变业务相关的类及其相应的方法,而不需要动整个代码。

  书中介绍的一个比较经典的例子就是:四大发明之一--------活体印刷。  

  活体印刷的好处就是:


    一、扩展性(在语句中进行增删)

    二、复用性(多个语句可以既=多次使用同一个字)
    三、可变性(替换语句中的某个字)
    四、灵活性(无论是横式排版还是竖式排版,都比较方便)

  设计计算器的运算:
    第一:代码的规范性
    第二:封装性:“+”“-”“*”“/”。

      只做到以上两点,还不够,还应该降低代码的耦合度:即不同的运算规则,应进行分散
    第三:继承性 重写计算方法
    第四:多态性 通过不同的运算符号,返回不同的运算对象

  以下为如何通过面向对象语言来实现计算器功能的code

  界面逻辑:

 1 public class ResultClient {
 2 
 3     public static void main(String[] args){
 4         Scanner scanner new Scanner(System.in);
 5         System.out.println("请输入第一个数字:");
 6         double numberA = 0;
 7         try{
 8              numberA = scanner.nextDouble();
 9         }catch(Exception e) {
10              System.out.println("必须输入数字");
11             e.printStackTrace();
12             return;
13          }
14         System.out.println("请输入你需要的运算符号:+、-、*、/");
15         String operation = scanner.next();       
16         Operation operationObj = CreateOperationObj.createOperation(operation);
17         System.out.println("请输入第二个数字:");
18         double numberB = scanner.nextDouble();
19         operationObj.setdoubleA(numberA);
20         operationObj.setdoubleB(numberB);
21          System.out.println("运算结果为:"+operationObj.getResult());

业务逻辑:计算方法的model类、创建对应的model

  动态创建对应的model

public class CreateOperationObj {
   public static Operation createOperation(String operation){
          Operation operationObj = null;
           switch(operation){
               case "+":    
               operationObj = new OperationAdd();
               break;
           case "-":
                 operationObj = new OperationSub();
               break;
           case "*":
                operationObj = new OperationMul();
               break;
           case "/":
                operationObj = new OperationDiv();
           }
           return operationObj;
        }
}

创建model类并重写父类方法

父类

public class Operation {
    double numberA;
    double numberB;
    public double getdoubleA() {
        return numberA;
    }
    public void setdoubleA(double numberA) {
        this.numberA = numberA;
    }
    public double getdoubleB() {
        return numberB;
    }
    public void setdoubleB(double numberB) {
        this.numberB = numberB;
    }
    public double getResult(){
                double result = 0;
        return result;
    }
}
public class OperationAdd extends Operation {

    public double getResult() {
        double result = 0;
                result = numberA+numberB;
        return result;
    }
}

减法

public class OperationSub extends Operation {

    public double getResult() {
        double result = 0;
                result = numberA-numberB;
        return result;
    }
    
}            

乘法

public class OperationMul extends Operation {

    public double getResult() {
        double result = 0;
                result = numberA*numberB;
        return result;
    }
    
}

除法:

public class OperationDiv extends Operation {

    public double getResult() {
        double result = 0;
                if (numberB == 0) {
            try {
                throw new Exception("除数不能为0");
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            result = numberA / numberB;
        }
        return result;
    }
}
原文地址:https://www.cnblogs.com/charging-for-ycp/p/7359585.html