考虑这样一个场景:
实现一个计算器,包括加减两种运算方法,使用Operation类作为父类,加减两个子类继承该父类。再通过一个简单工厂来根据客户端需要的运算类型返回具体的运算类完成运算。
Operation类
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Operation {
private int num1;
private int num2;
public Integer getResult() {
return 0;
}
}
两个子类:OperationAdd和OpeartionMin
public class OperationAdd extends Operation{
@Override
public Integer getResult() {
return this.getNum1() + this.getNum2();
}
}
public class OperationMinus extends Operation{
@Override
public Integer getResult() {
return this.getNum1() - this.getNum2();
}
}
以及最重要的简单工厂类:
public class OperationFactory {
public static Operation getInstance(String type) {
switch (type) {
case "-": return new OperationMinus();
case "+": return new OperationAdd();
default: return null;
}
}
}
静态方法getInstance根据传入的type类型获取实例
测试代码如下:
public class Client {
public static void main(String[] args) {
int a = 1, b = 2;
Operation operation = OperationFactory.getInstance("+");
operation.setNum1(a);
operation.setNum2(b);
System.out.println(operation.getResult());
a = 99;
b = 109023;
Operation operation2 = OperationFactory.getInstance("-");
operation2.setNum1(a);
operation2.setNum2(b);
System.out.println(operation2.getResult());
}
}
简单工厂模型就是根据传入的type类型来获取对应的实例,由于这些实例都继承一个基类或实现了一个接口,客户端在使用这些实例时可以通过这个基类或接口去调用对应方法。
使用这种设计模式的好处是显而易见的,假如现在要增加一个新的计算方法:除法。那么原先的算法类不需要做任何改动,直接添加一个新的Operation子类OperationDiv类实现除法运算,并且添加进工厂的switch模块中即可,拓展性良好,且客户端使用时也不需要去关心这些类的创建逻辑。
这种设计模式体现了面向对象的继承以及多态。
网友评论