前面学习了简单工厂模式,工厂方法模式,并且通过实例知道了他们的应用情景和优缺点。于此回顾一下:
简单工厂模式:
一个工厂负责所有类的对象的创建,不支持无缝的新增类的类型对象的创建,不符合高内聚的
原则.(可以通过反射机制)改良一下。
工厂方法模式:
多个工厂负责多个产品对象的创建,每个工厂只负责具体类型对象的创建,支持无缝新增类型
对象的创建,符合高内聚原则,需要实现工厂接口类和产品接口类。但是,会照成工厂类太多,难以维护.
既然知道了简单工厂模式,工厂方法模式的一些不足,如何进行改进、克服呢?这就要使用抽象工厂模式
了。
通过前面的学习,我们知道每一个设计模式都是针对一定问题的解决方案,工厂方法模式针对的是一个
产品等级结构,而抽象工厂模式则针对的是多个产品等级结构。
在学习抽象工厂模式之前首先要理解产品族的概念:
所谓产品族,是指位于不同的产品等级结构,功能相关联的产品家族。如图:
由图可以看出,图中一共有三个产品族,分布于三个不同的产品结构中。若要确定一个产品则必须指明
它所在的产品族和所处的等级结构。
所谓的抽象工厂模式就是处于工厂等级结构中的一个具体的工厂,可以创建出分属于不同产品结构的
一个产品族的所有的对象。如上图所示。从这点就可以看出抽象工厂和工厂方法模式的区别所在了,工厂
方法模式的具体工厂类只能创建一个对象,而抽象工厂模式可以创建多个对象。
那么,抽象工厂模式到底是如何工作的呢?首先看看其类图结构吧。
类图中所描述的产品族结构可以表示如下:
那么抽象工厂有哪些角色组成呢?其实抽象工厂模式和工厂方法模式的组成角色类似,只是各个角色具体完成
的功能可能会略有区别而已。角色组成及作用如下:
抽象工厂角色:
是模式的核心部分,与应用程序的逻辑是无关的。
具体工厂角色:
用于创建产品的实例,并且含有如何创建该产品对象的逻辑,与应用程序功能密切相关。
抽象产品角色:
具体工厂所能创建的对象的父类,或则是他们共同拥有的接口。
具体产品角色:
真正的完成应用程序的逻辑功能的部分,继承或实现抽象产品角色。
看一下例子程序代码:(根据的上面的类结构图,个命名并没有实际含义)
抽象工厂类:
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{
}
通过实例代码,可以看到工厂方法模式和抽象方法模式有很多地方相同的,只是在具体工厂的实现上
不同 ,那么两者的区别组要是什么呢?
理解了上述代码结构不难发现,工厂方法模式可以看成是抽象方法模式的一种特例,工厂方法模式是创建
一个产品结构的,而抽象工厂模式是用来创建多个产品结构的。一般说来工厂方法只有一个产品抽象类,而抽
象工厂有多个产品抽象类。工厂方法模式中的工厂具体类只能创建一类产品类对象,而抽象工厂模式的具体工
厂可以创建多个产品类的实例。