1.抽象工厂模式
产品族:指不同产品等级机构中,功能相关联的产品组成家族。例如:微型计算机有2个系列:PC和MAC系列。2个产品系列中都有Ram和CPU产品。那么PC-Ram和PC-CPU就组成了PC产品族。MAC-Ram和MAC-CPU就组成了MAC产品族。
工厂方法模式适用于一个层级结构复杂的产品系列的创建,但是当一个系统需要创建多个产品系列,如上面的例子中有2个产品系列。如果使用工厂方法模式就需要2个独立的工厂等级结构。而这些工厂结构中又有相似性。当产品系列增加,必然导致工厂结构增加,系统维护和扩展都会很困难。这时候给这些工厂抽象出一个抽象层,很有必要。这就是抽象工厂模式。
2.模式结构
抽象工厂(Creator):工厂结构的抽象,定义所有工厂的相似结构。接口或抽象类实现。
具体工厂(ConcreteCreator):具体工厂,实现抽象工厂定义的结构。每个具体工厂负责创建此系列(产品族)下的商品。
抽象产品(ProductA和ProductB):产品抽象,定义一个抽象产品。
具体产品(ProductA1、ProductA2、ProductB1和ProductB2):具体产品。
如果使用微型计算机例子,则类图如下:
3.源码:
Creator:
public interface Creator
{
//定义工厂结构,可制造ProductA和B两种产品
public ProductA factoryA();
public ProductB factoryB();
}
ConcreteCreator1:
public class ConcreteCreator1 implements Creator
{
public ProductA factoryA()
{
return new ProductA1();
}
public ProductB factoryB()
{
return new ProductB1();
}
}
ConcreteCreator2和ConcreteCreator1类似
Product 的代码和简单工厂中相似,只是多了一个产品系列。
客户端调用代码:
public class Client
{
public static void main(String[] args)
{
Creator creator = new ConcreteCreator1(); //需要哪个产品系列初始化哪个工厂
prodA = creator.factoryA();
prodB = creator.factoryB();
}
}
4 总结
1,增加新的产品族,只需要添加新的工厂子类。不需要修改已有的工厂和产品,在此方面遵循开闭原则。
2,增加新的产品等级结构,需要抽象工厂,并且修改所有的具体工厂,不支持开闭原则。
所以:抽象工厂模式,为增加新的产品族提供方便,不能对对增加产品等级结构,适用于产品等级结构明确的系统。