可以使用简单工厂模式,避免调用类中的代码坏味道,在下面的例子中,主要是避免判断代码直接写在调用类中。
首先定义抽象类,抽象类中封装了操作属性:
public abstract class Caculation {
protected double numberA;
protected double numberB;
public abstract double caculate();
public void setNumberA(double numberA) {
this.numberA = numberA;
}
public void setNumberB(double numberB) {
this.numberB = numberB;
}
}
各具体的运算实现类:
public class OpAdd extends Caculation {
@Override
public double caculate() {
return this.numberA + this.numberB;
}
}
多个具体实现类,这里不一一列出了。
定义一个工厂方法,封装构造具体运算实现类的过程:
public class CaculationFactory {
public static Caculation getCaculation(char op){
Caculation caculation = null;
switch (op) {
case '+':
caculation = new OpAdd();
break;
case '-':
caculation = new OpSub();
break;
case '*':
caculation = new OpMul();
break;
case '/':
caculation = new OpDiv();
break;
default:
break;
}
return caculation;
}
}
现在举例调用类的调用过程(只列出关键代码):
Caculation caculation = CaculationFactory.getCaculation(operator.charAt(0));
caculation.setNumberA(getNumber(numberA));
caculation.setNumberB(getNumber(numberB));
System.out.println("Result is:"+caculation.caculate());
这样调用时,仅需通过工厂类,即可获取所需的算法实现类,原有调用类中的if判断等被转移到工厂类中了,维护时也仅需修改工厂类,简化了调用类中的代码。
使用简单工厂模式后各类间的耦合关系:
调用类 | 工厂类 | 抽象类 | 算法实现类 | |
调用类 | 耦合 | 耦合 | ||
工厂类 | 耦合 | 耦合 | ||
抽象类 | ||||
算法实现类 | 继承 |
简单工厂作为创建型模式中最简单的一种,在此处看来,主要是将调用类与具体类中的耦合转移到工厂类中,并由工厂类管理创建的细节,提高代码的可维护性和可扩展性。