设计模式---抽象工厂模式

来源:互联网 发布:淘宝客地推海报 编辑:程序博客网 时间:2024/05/20 10:10

     前面学习了简单工厂模式,工厂方法模式,并且通过实例知道了他们的应用情景和优缺点。于此回顾一下:

     简单工厂模式:

                    一个工厂负责所有类的对象的创建,不支持无缝的新增类的类型对象的创建,不符合高内聚的

             原则.(可以通过反射机制)改良一下。

     工厂方法模式:

                   多个工厂负责多个产品对象的创建,每个工厂只负责具体类型对象的创建,支持无缝新增类型

         对象的创建,符合高内聚原则,需要实现工厂接口类和产品接口类。但是,会照成工厂类太多,难以维护.

         既然知道了简单工厂模式,工厂方法模式的一些不足,如何进行改进、克服呢?这就要使用抽象工厂模式

         了。

                 通过前面的学习,我们知道每一个设计模式都是针对一定问题的解决方案,工厂方法模式针对的是一个

          产品等级结构,而抽象工厂模式则针对的是多个产品等级结构。

                在学习抽象工厂模式之前首先要理解产品族的概念:

              所谓产品族,是指位于不同的产品等级结构,功能相关联的产品家族。如图:

                 由图可以看出,图中一共有三个产品族,分布于三个不同的产品结构中。若要确定一个产品则必须指明

       它所在的产品族和所处的等级结构

                 所谓的抽象工厂模式就是处于工厂等级结构中的一个具体的工厂,可以创建出分属于不同产品结构的

       一个产品族的所有的对象。如上图所示。从这点就可以看出抽象工厂和工厂方法模式的区别所在了,工厂

       方法模式的具体工厂类只能创建一个对象,而抽象工厂模式可以创建多个对象。

                 那么,抽象工厂模式到底是如何工作的呢?首先看看其类图结构吧。

                       

                 类图中所描述的产品族结构可以表示如下:

           那么抽象工厂有哪些角色组成呢?其实抽象工厂模式和工厂方法模式的组成角色类似,只是各个角色具体完成

的功能可能会略有区别而已。角色组成及作用如下:

            抽象工厂角色:

                    是模式的核心部分,与应用程序的逻辑是无关的。

            具体工厂角色:

                   用于创建产品的实例,并且含有如何创建该产品对象的逻辑,与应用程序功能密切相关。

            抽象产品角色:

                   具体工厂所能创建的对象的父类,或则是他们共同拥有的接口。

             具体产品角色:

                    真正的完成应用程序的逻辑功能的部分,继承或实现抽象产品角色。

       看一下例子程序代码:(根据的上面的类结构图,个命名并没有实际含义)

             抽象工厂类:

package com.kiritor;/**抽象工厂类*/public interface AbstractFactory {    public AbstractProductA createProductA();    public AbstractProductB createProductB();}
            具体工厂类:
package com.kiritor;/**用于创建一号类型的产品族的工厂*/public class Factory1 implements AbstractFactory {@Overridepublic AbstractProductA createProductA() {// TODO Auto-generated method stubreturn new ProductA1();}@Overridepublic AbstractProductB createProductB() {// TODO Auto-generated method stubreturn new ProductB1();}}/**用于创建二号类型的产品族的工厂*/package com.kiritor;public class Factory2 implements AbstractFactory{@Overridepublic AbstractProductA createProductA() {// TODO Auto-generated method stubreturn new ProductA2();}@Overridepublic AbstractProductB createProductB() {// TODO Auto-generated method stubreturn new ProductB2();}}
               抽象产品:
package com.kiritor;/**抽象产品*/public abstract class AbstractProductA {   private String name ;   public String getName()   {   return this.name;   }}package com.kiritor;/**抽象产品*/public abstract class AbstractProductB {private String name;public String getName() {return name;}}
              具体产品:
package com.kiritor;public class ProductA1 extends AbstractProductA{}package com.kiritor;public class ProductA2 extends AbstractProductA{}package com.kiritor;public class ProductB1 extends AbstractProductB{}package com.kiritor;public class ProductB2 extends AbstractProductB{}
               通过实例代码,可以看到工厂方法模式和抽象方法模式有很多地方相同的,只是在具体工厂的实现上

  不同 ,那么两者的区别组要是什么呢?

              理解了上述代码结构不难发现,工厂方法模式可以看成是抽象方法模式的一种特例,工厂方法模式是创建

  一个产品结构的,而抽象工厂模式是用来创建多个产品结构的。一般说来工厂方法只有一个产品抽象类,而抽

  象工厂有多个产品抽象类。工厂方法模式中的工厂具体类只能创建一类产品类对象,而抽象工厂模式的具体工

  厂可以创建多个产品类的实例。

           

原创粉丝点击