抽象工厂方法

来源:互联网 发布:淘宝购买处方药流程 编辑:程序博客网 时间:2024/06/08 19:00

在工厂方法中,我们可以很方便的创建一个产品继承结构下的多个产品。那么考虑这么一种情况:我们需要在工厂中创建多个不同继承结构的产品。例如皮肤库:包含按钮、文本框、选择框等多个不同的元素。Spring皮肤库包含了一组相似的按钮、文本框、选择框;扁平皮肤库包含了一组扁平化的按钮、文本框、选择框;护眼皮肤库包含了一组颜色温和护眼的按钮、文本框、选择框。在这里按钮是一个产品结构(包含了Spring按钮,扁平按钮,护眼按钮),文本框是一个产品结构,选择框是一个产品结构。而同一个皮肤库里的按钮,文本框,选择框我们称之为一个产品族。如果用工厂方法,我们需要3*3=9个工厂,每次增加一个皮肤库,我们就需要增加3个工厂。这会导致工厂类数量急剧增加,不符合需求。可以考虑用抽象工厂方法。

抽象工厂方法:定义一个创建一系列相关或相互依赖对象的接口,而无须指定它们的类。它是一种对象创建型模式
在抽象工厂模式中,每一个工厂实现类都提供了多个工厂方法以创建不同类型的产品(产品族)。抽象工厂模式是所有工厂模式中最具代表性和普遍性的模式,工厂模式可以看出是产品族只有一种产品的抽象工厂模式。

类图:这里写图片描述

工厂模式优缺点:
优点:能够很方便地增加一个产品族,只需要增加相应的产品类和一个工厂实现类。完全符合开闭原则。
缺点:不支持新增产品结构。如果需要新增一个产品结构,列如上例中需要在皮肤库中增加一个Radio单选框,那么需要在工厂接口中新增一个getRadio方法,所有的工厂实现类都要重新新增getRadio方法。稍微优化一点的做法是新增一个抽象工厂类,实现工厂接口,所有的工厂实现类都继承自抽象工厂类,而不是直接实现接口。这样只需要在抽象工厂类中新增getRadio方法就可以让所有的工厂实现类得到getRadio方法,但这样也只能得到一个公共的方法,如果需要有各种不同风格的radio,还是要在各自的工厂类中新增getRadio方法,显得很麻烦。
所以要求在设计之初就要全面考虑好产品结构,尽量不要在后期新增或减少产品结构,否则会给后期维护带来麻烦。

皮肤库的类图:
这里写图片描述
主要参考:http://blog.csdn.net/LoveLion/article/details/9319481