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

     简单工厂模式:

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

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

     工厂方法模式:

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

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

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

         了。

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

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

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

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

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

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

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

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

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

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

                       

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

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

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

            抽象工厂角色:

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

            具体工厂角色:

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

            抽象产品角色:

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

             具体产品角色:

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

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

             抽象工厂类:

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

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

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

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

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

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