在《重构 改善既有代码的设计》8.14 以子类取代类型码一节中,使用到了一种类似于简单工厂的方法,当时将基类定义为抽象类,并创建了一个静态方法create(mode MODE),使用该方法来实例化。
如果使用简单工厂,就可以新建一个工厂类,把实例化对象的任务交给工厂类。
public class PowerManagerNewFactory{
public static PowerManagerNew createPowerManagerNew(PowerManagerNew.MODE mode) {
switch(mode) {
case A: return new PowerManagerNewA();
case B: return new PowerManagerNewB();
case C: return new PowerManagerNewC();
default: throw new IllegalArgumentException();
}
}
}
实例化对象是只需要通过静态方法即可。
PowerManagerNew powerManagerNew = PowerManagerNewFactory.createPowerManagerNew(PowerManagerNew.MODE.A);
powerManagerNew.set();
新增了 一个PowerManagerNewD类,如果mode是String类,只要在createPowerManagerNew方法中增加一种case,返回PowerManagerNewD对象即可。如果mode是enum,则还需要修改PowerManagerNew.MODE。但是使用enum的好处就是避免了调用时字符串拼写错误,运行时才能发现。
如果不用简单工厂,对于PowerManager类,在每个依赖mode来确定行为的方法中,都要使用switch语句或if语句进行选择。此外,如果对于新添加一种mode的情况,使用多态的方法,可以避免修改时对其他mode的代码造成破坏。
参考
大话设计模式