行为目的:
为需要创建的一个对象创建接口,让子类决定具体实例化那个类。工厂方法把实例化延缓到子类实现。
问题起源:
假设有这么一个应用框架,用于管理系统文档。文档包含各式各样的类型,不同的类型定义为不同的文档,但是它们依旧拥有相同的操作过程,打开,读,写,关闭等。基于面向接口的设计,在管理文档的类中我们不要求知道具体要操作的是什么类型的文档,而只需知道什么时候去创建它。管理文档的类只包含文档类的接口,而接口是不能实例化的。工厂方法就是来解决这个问题的,应用程序无需知道具体的文档类型,实现应用程序与文档类型之间的解耦。应用程序只需通过工厂方法类即返回想要的文档类实例。
使用情况:
1)应用类对于要创建的具体类处于未知的状态;
2)类希望子类去实现类的创建,工厂接口与工厂实现类;
3)代理类有多个辅助型子类,在使用时需要实例化详细的子类。
UML结构框图:
UML框图说明:
使用说明:
构建器依靠子类返回具体的产品类实例。
模式优缺点:
工厂方法隐藏了具体产品类实现,直接面向于产品类接口,实现工厂类与具体产品类之间的解耦。
缺点是工厂方法需要为创建产品专门提供相应的产品接口和工厂类,与抽象工厂类似,抽象接口定义的方法很难去扩展。
1)工厂方法接口为工厂实现类提供备用接口实现。在工厂方法内部创建产品类相比之间创建非常灵活,工厂方法对于拓展的产品类提供了非常容易的扩展实现。
2)为并行层次产品类提供了很好的关联实现。对于工厂方法接口,可以实现多个不同的工厂方法实现类。不同的工厂方法实现类针对不同的产品类生成。比如在Ui界面制作过程中,对于line和text内容的绘制结果是不同的,line竖向占位较少,而text通常需要切换到新行进行绘制,然而他们都是属于界面绘制的类型。针对line和text,设计不同的工厂方法类很容易解决二者之间的区别问题。
实现细节:
1)工厂方法中,工厂抽象类是可选择实现的,请根据实际需要决定。
2)参数工厂方法,根据不同的参数,返回不同的产品类。
3)通过设计模板工厂方法类,避免实现其子类。
示例代码:
Java类库中的使用:
关联模式:
工厂方法通常与抽象工厂,模板方法配合使用。