工厂方法模式(Factory Method):
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类
如果没有看过简单工厂模式的话可以花一点点时间了解一下简单工厂模式
在简单工厂模式中说过,既然简单工厂类对分支耦合,那么我们就要把它拆开,根据依赖倒置原则,我们根据工厂类抽象出一个接口,所有的工厂都要实现这个接口。
下面是工厂方法模式的UML图
可以看到,与简单工厂模式的区别就在于把工厂抽象出了一个抽象工厂接口
代码实现
工厂接口
public interface Factory {
public Operation createOperation() ;
}
实现接口的工厂类
public class AddFactory implements Factory{ // 加法工厂
public Operation createOperation() {
return new Add();
}
}
public class SubFactory implements Factory{ // 减法工厂
public Operation createOperation() {
return new Sub();
}
}
........乘法和除法类似
运算类不变
最后是客户端
public class Client {
public static void main(String[] args) throws Exception {
Operation oper1 = addFactory.createOperation();
Operation oper2 = subFactory.createOperation();
System.out.println(oper1.getResult(1, 2));
System.out.println(oper2.getResult(3, 4));
}
}
总结
在工厂方法模式中,核心的工厂类不再负责对相应子类的创建,而是声明一个子工厂类必须实现的接口,具体的实例化工作由子工厂类去做。这样整个体系并没有对修改开放,而是只对扩展开放,符合开放-封闭原则。
我们如果想要加功能的话,就不是像简单工厂一样要修改工厂类了,而是把修改放到客户端,对于工厂类和运算类的改变就只是扩展。
可以说工厂方法模式克服了简单工厂违背开放-封闭原则的缺点,又保持了封装对象创建过程的优点。