设计模式-简单工厂模式

152 阅读1分钟

简单工厂模式

  • 基本思想:分而冶之
  • 目的:扩展性、灵活性

心得

  • 首先要抽象出这个对象的属性和方法的共性,再从扩展性和灵活性的角度考虑每个模块的独立性

  • 以计算器项目为例,我们抽象出每个计算机操作由如下组成number1,number2,操作符,所以我们可以写一个类做为父类让,加减,减,乘,除类继承

  • 为什么不用接口呢,因为接口不支持定义属性

类比

  • 假设有一家工厂生产汽车,有摩托车,自行车,汽车。工厂类对外封装,当客户传入车类型,最终就会交付相应的车类型出来

代码

父类代码

public class Operation {
    public Long NumberA;
    public Long NumberB;

    public Long getNumberA() {
        return NumberA;
    }

    public void setNumberA(Long numberA) {
        NumberA = numberA;
    }

    public Long getNumberB() {
        return NumberB;
    }

    public void setNumberB(Long numberB) {
        NumberB = numberB;
    }

    public Long GetResult(){
        Long result;
        result = 0L;
        return result;
    }

}

加、减、乘、除 子类继承

  • 加法
public class OperationAdd extends Operation {

//    public Long getNumberA() {
//        return NumberA;
//    }
//
//    public void setNumberA(Long numberA) {
//        NumberA = numberA;
//    }
//
//    public Long getNumberB() {
//        return NumberB;
//    }
//
//    public void setNumberB(Long numberB) {
//        NumberB = numberB;
//    }

    @Override
    public Long GetResult() {
        Long result = 0L;
        result = NumberA + NumberB;
        return result;
    }
}

  • 除法

    public class OperationDiv extends Operation {
    
        @Override
        public Long GetResult() {
            Long result = 0L;
            if (NumberB == 0) try {
                throw new Exception("除数不能为0");
            } catch (Exception e) {
                e.printStackTrace();
            }
            result = NumberA / NumberB;
            return result;
        }
    }
    
    
  • 乘法

    public class OperationMul extends Operation {
    
        @Override
        public Long GetResult() {
            Long result = 0L;
            result = NumberA * NumberB;
            return result;
        }
    }
    
    
  • 减法

    public class OperationSub extends Operation {
    
        @Override
        public Long GetResult() {
            Long result = 0L;
            result = NumberA - NumberB;
            return result;
        }
    }
    

工厂类封装调用操作子类

public class OperationFactory {

    public static Operation CreateOperate(String operate){
        Operation oper = null;
        switch (operate){
            case "+":
                oper = new OperationAdd();
                break;
            case "-":
                oper = new OperationSub();
                break;
            case "*":
                oper = new OperationMul();
                break;
            case "/":
                oper = new OperationDiv();
                break;

        }
        return oper;
    }

}

主调用类

public class Main{

        public static void main(String[]args){
/*
                OperationAdd calc = new OperationAdd();
                calc.setNumberA(10L);
                calc.NumberB = 30L;
                System.out.println(calc.GetResult());
 */
                Operation oper;
                oper = OperationFactory.CreateOperate("-");
                System.out.println("调用减法类");
                oper.NumberA = 15L;
                oper.NumberB = 10L;
                System.out.println(oper.GetResult());


        }

}