简单工厂虽然对产品生产提供了非常好的封装,但并没有遵循面向对象设计的”开放-关闭原则“,工厂方法模式可解决这个问题。
“开放-关闭原则”:对扩展开放、对修改关闭。什么意思呢?我的理解是:当我们要扩展新功能时,不需要修改原来的代码,简单的添加某个类、或继承某个抽象类、或实现某个接口就可以完成。
再看上篇中SimpleFactory这个工厂类,如果我们要新增一种输出设备(这是实际项目中肯定会面临的变化)则必须修改这个类,即添加一个if/else或switch/case语句。
下面是工厂方法模式:
public interface OutPut {}
public class Monitor implements OutPut {}
public class Print implements OutPut {}
public interface OutPutFactory {
OutPut createOutput();
}
public class MonitorFactory implements OutPutFactory {
public OutPut createOutput() {
return new Monitor();
}
}
public class PrintFactory implements OutPutFactory {
public OutPut createOutput() {
return new Print();
}
}
我们将原来的工厂类改为接口或抽象类型,然后将createOutput()方法中实际生产“设备”的if/else分支操作分解到抽象工厂类的各个具体子类工厂中去,将产品的生成交给子类工厂来完成。每个具体子类工厂负责完成一中产品的生产。
这时,如果我们想新增一种输出设备,如File,则完全不用修改原有的代码,将File实现OutPut接口,然后再添加一个生成这个产品的工厂FileFactory即可。
public class Main {
public static void main(String[] args) {
OutPutFactory factory = new PrintFactory();
output = factory.createOutput();
factory = new MonitorFactory();
output = factory.createOutput();
}
}
这样,我们就解决了“开放-关闭”问题,并且允许客户端随意消费产品。
工厂方法模式的关键在于:一个抽象产品类派生多个具体产品类、一个抽象工厂类派生多个具体工厂子类、每个具体工厂子类负责生产一种具体产品、客户端针对接口编程。
下一篇:抽象工厂