在前面讨论过,简单工厂模式,我们发现,在增加新的运算类之前,还是要新增一个运算类和修改case条件,这样我们就破坏了“封闭”原则。便于以后的拓展,我们把工厂抽象成接口,让每种运算独立出来为工厂,由调用者判断调用哪个工厂方法,把简单工厂的判断逻辑放到调用者上来
具体改造:
新增一个工厂接口
public interface ICalculatorFactory {
Operation createOperation(double firstNumber,double secondNumber);
}
增加方法的工厂
public class AddFactory implements ICalculatorFactory {
@Override
public Operation createOperation(double firstNumber,double secondNumber) {
// TODO Auto-generated method stub
return new Add(firstNumber,secondNumber);
}
}
.....
测试
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(new AddFactory().createOperation(30,20).getResult());
}
}
简单工厂工厂和工厂模式的异同:
相同点:都是由工厂来决定业务类
不同点:1简单工厂模式,业务逻辑放在了工厂方法内,工厂模式独立出来工厂,去掉逻辑判断,主导权交给调用者
2简单工厂模式的拓展(增加子类)需要修改工厂方法,工厂方法开放;工厂模式拓展,需要增加相应的子类工厂,子类工厂独立封闭