抽象工厂(Abstract Factory)模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。
抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构。
为了方便引进抽象工厂模式,特地引进一个新的概念:产品族(Product Family)。所谓产品族,是指位于不同产品等级结构中,功能相关联的产品组成的家族。
抽象工厂模式的结构图如下:
源代码:
public
interface
Creator
...
{
public ProductA factoryA();
public ProductB factoryB();
}
public class ConcreteCreator1 implements Creator ... {
public ProductA factoryA() ...{
return new ProductA1();
}
public ProductB factoryB() ...{
return new ProductB1();
}
}
public class ConcreteCreator2 implements Creator ... {
public ProductA factoryA() ...{
return new ProductA2();
}
public ProductB factoryB() ...{
return new ProductB2();
}
}
public interface ProductA ... {
}
public class ProductA1 implements ProductA ... {
public ProductA1() ...{
}
}
public class ProductA2 implements ProductA ... {
public ProductA2() ...{
}
}
public interface ProductB ... {
}
public class ProductB1 implements ProductB ... {
public ProductB1() ...{
}
}
public class ProductB2 implements ProductB ... {
public ProductB2() ...{
}
}
public ProductA factoryA();
public ProductB factoryB();
}
public class ConcreteCreator1 implements Creator ... {
public ProductA factoryA() ...{
return new ProductA1();
}
public ProductB factoryB() ...{
return new ProductB1();
}
}
public class ConcreteCreator2 implements Creator ... {
public ProductA factoryA() ...{
return new ProductA2();
}
public ProductB factoryB() ...{
return new ProductB2();
}
}
public interface ProductA ... {
}
public class ProductA1 implements ProductA ... {
public ProductA1() ...{
}
}
public class ProductA2 implements ProductA ... {
public ProductA2() ...{
}
}
public interface ProductB ... {
}
public class ProductB1 implements ProductB ... {
public ProductB1() ...{
}
}
public class ProductB2 implements ProductB ... {
public ProductB2() ...{
}
}
在以下情况下应当考虑使用抽象工厂模式:
1. 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。
2. 这个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品(这一条是抽象工厂模式的原始用意)。
3. 同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。
4. 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。
当系统中的产品族增加时,抽象工厂模式是支持“开-闭”原则的;但对于产品等级结构的增加,抽象工厂模式不支持“开-闭”原则。