下面用一个模拟计算器的例子简单讲解一下:
一、控制台输入两个数和运算符,模拟加减乘除四则运算
1.加、减、乘、除四种操作均为运算操作,可抽取抽象公共父类Operator
public abstract class Operator {
//操作数number_A
private String number_A;
//操作数number_B
private String number_B;
public String getNumber_A() {
return number_A;
}
public void setNumber_A(String number_A) {
this.number_A = number_A;
}
public String getNumber_B() {
return number_B;
}
public void setNumber_B(String number_B) {
this.number_B = number_B;
}
//执行运算,并获取结果
public abstract double getResult();
}
加法子类:
public class Add extends Operator{
@Override
public double getResult() {
double number_A=Double.parseDouble(getNumber_A());
double number_B=Double.parseDouble(getNumber_B());
return number_A+number_B;
}
}
减法子类:
public class Sub extends Operator{
@Override
public double getResult() {
double number_A=Double.parseDouble(getNumber_A());
double number_B=Double.parseDouble(getNumber_B());
return number_A-number_B;
}
}
乘法子类:
public class Mul extends Operator{
@Override
public double getResult() {
double number_A=Double.parseDouble(getNumber_A());
double number_B=Double.parseDouble(getNumber_B());
return number_A*number_B;
}
}
除法子类:
public class Div extends Operator{
@Override
public double getResult() {
double number_A=Double.parseDouble(getNumber_A());
double number_B=Double.parseDouble(getNumber_B());
return number_A/number_B;
}
}
各个子类只是重写了getResult方法,表现出自己的特性(进行加、减、乘、除操作)
2.工厂类(通俗来说就是集中new 同一类型的对象):根据用户输入的运算符,选择性返回生成的对应的子类
public class OpFactory {
public static Operator create(String operatorStr) {
switch(operatorStr) {
case "+":
return new Add();
case "-":
return new Sub();
case "*":
return new Mul();
case "/":
return new Div();
default:
throw new RuntimeException("不支持该运算操作");
}
}
}
运算工厂通过传入的运算符,返回对应的运算类,如果传入了不支持的运算符,将会抛出一个运行时异常
3.测试类:
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入数A:");
String number_A=scanner.nextLine();
System.out.println("请输入数B:");
String number_B=scanner.nextLine();
System.out.println("请输入操作符:");
String operatorStr=scanner.nextLine();
scanner.close();
Operator operator=OpFactory.create(operatorStr);
operator.setNumber_A(number_A);
operator.setNumber_B(number_B);
System.out.println("运算结果为:"+operator.getResult());
}
从控制台输入依次输入数A、B、操作符,然后用工厂类根据操作符获取对应的操作类,并执行运算
二、如果想要新添加一个开方的运算,那么只需要添加一个开方的子类继承父类,并在工厂类里面加入它的生成即可!
总结特点:利用多态的特性,在一个工厂类中生成子类,方便以后代码的维护和扩展,即简单工厂模式