一、模式介绍
工厂方法模式使用多态代替简单工厂模式中的分支判断(switch-case)
即采用不同的工厂生产不同的产品,而不是一个工厂生产所有产品
需要什么产品,客户端首先要获得对应的工厂,不同工厂需要实现同一个公共的的工厂抽象接口
采用工厂方法模式的优势是:增加产品后,无需修改原来的简单工厂分支判断了,而是通过拓展一个工厂类实现
也即:对修改关闭,对扩展开放(其实也不是完全关闭了修改,只是这个修改移到客户端部分了)
工厂方法模式在扩展时需要:实现新产品以及对应的工厂
简单工厂模式在扩展时需要:实现新产品,同时修改原来工厂的分支判断,把新产品加进去
抽象工厂模式:就是工厂方法模式上的简单扩展,工厂生产一系列产品,而不是一个,
优势是方便通过切换工厂,变更所有产品
抽象工厂模式典型的可以应用于数据库切换
二、使用工厂方法模式实现计算器
我们依然复用大话设计模式 —— 简单工厂模式的代码
包括 Operation 接口 、AddOperation、SubOperation、DefaultOperation
然后,我们编写一个工厂抽象接口
public interface OperationFactory {
Operation getOperation();}
分别针对不同类别计算,实现对应的工厂方法
public class AddFactory implements OperationFactory{
@Override
public Operation getOperation() {
return new AddOperation();
}}
public class SubFactory implements OperationFactory{
@Override
public Operation getOperation() {
return new SubOperation();
}}
测试类,先获取对应工厂,然后生产对应产品
public class Main {
public static void main(String[] args) {
OperationFactory factory = new AddFactory(); // 加法工厂
Operation opt = factory.getOperation(); // 加法工厂生产的是加法运算操作
System.out.println(opt.compute(1, 2));
factory = new SubFactory(); // 减法工厂
opt = factory.getOperation(); // 减法工厂生产的是减法运算操作
System.out.println(opt.compute(1, 2));
}}
=========
特别补充:
工厂方法模式和抽象工厂模式,在客户端存在大量关于创建具体工厂的代码,这也给维护带来了难度
因此,可以把工厂的创建过程使用简单工厂模式再封装下,编写一个生产工厂的工具类,比如 OperationFactoryProvider
该类内部可以基于配置文件配置创建合适的工厂(switch-case),
更高级地可以使用反射创建工厂对象(这样就不用 switch-case 了,又前进了一步 ^_^)
Hibernate 等框架的数据库切换我想可能就是基于这种思想吧!