模式简介
工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化那个类,其使一个类的实例化延迟到其子类中。
前边我们学习了简单工厂模式,简单工厂模式的最大优势在于工厂类中包含了必要逻辑判断,根据客户端的条件动态实例化相关的类,对于客户端不需要了解具体的产品类,所以解除了对具体产品类的依赖。在引入新的产品的时候,我们不需要修改客户端代码,但是必须修改工厂,所以违背了开闭原则。
工厂方法模式是简单工厂模式的进一步抽象和推广。由于工厂类使用多态性,使其即保持了简单工厂模式的优点,也克服了其缺点。在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体的创建工作交给子类去做,它仅仅负责给出具体工厂类需要实现的接口。通过这种抽象和依赖倒转的结果,这样就可以允许我们在不修改具体工厂类的前提下,引进新的产品类型。
工厂方法模式的结构如下图,其一般会涉及到一下角色
图 1. 工厂方法模式结构图
抽象工厂:为具体的工厂类提供必需实现的接口,其通常是与具体的业务应用无关。
具体工厂:其实现抽象工厂定义的接口,其接受客户的调用创建产品对象。
抽象产品:工厂方法模式创建的产品对象的父类,其提供具体产品需要继承的成员。
具体产品:工厂类需要创建的产品对象。
JBPM中的工厂方法模式
日志功能往往是每个软件系统必备的模块,JBPM也不例外,其本身支持两种日志类型,我们可以通过配置灵活的选择。其中对Log对象的实例化使用了工厂方法模式,具体的结构图如下
图 1. JBPM中的工厂方法模式结构图
Log类作为产品基类,其提供了具体的产品需要实现的所有的接口,在这里就是获取日志等级开关和相应等级记录日志的接口;但是在这里其提供了一个静态的getLog方法,它是做什么用的呢?从代码的实现上来看,其持有一个工厂实例,如果这个工厂实例已经被实例化,那就直接调用工厂创建具体的日志类;如果还没有实例化,就读取相关的配置文件,根据配置来实例化相应的工厂类,然后调用工厂类创建产品。我们可以看到这一小段代码中使用了单例模式和简单工厂模式;单例模式避免每次获取Log对象的时候读取、解析配置文件、初始化相关的工厂类等繁琐的工作;简单工厂模式封装了具体工厂类的实例