简单工厂模式
- 基本思想:分而冶之
- 目的:扩展性、灵活性
心得
-
首先要抽象出这个对象的属性和方法的共性,再从扩展性和灵活性的角度考虑每个模块的独立性
-
以计算器项目为例,我们抽象出每个计算机操作由如下组成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());
}
}