1.抽象工厂模式
产品族:指不同产品等级机构中,功能相关联的产品组成家族。例如:微型计算机有2个系列:PC和MAC系列。2个产品系列中都有Ram和CPU产品。那么PC-Ram和PC-CPU就组成了PC产品族。MAC-Ram和MAC-CPU就组成了MAC产品族。
工厂方法模式适用于一个层级结构复杂的产品系列的创建,但是当一个系统需要创建多个产品系列,如上面的例子中有2个产品系列。如果使用工厂方法模式就需要2个独立的工厂等级结构。而这些工厂结构中又有相似性。当产品系列增加,必然导致工厂结构增加,系统维护和扩展都会很困难。这时候给这些工厂抽象出一个抽象层,很有必要。这就是抽象工厂模式。
2.模式结构
![](https://img-blog.csdn.net/20130806172723281?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3hoMTUyNw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
抽象工厂(Creator):工厂结构的抽象,定义所有工厂的相似结构。接口或抽象类实现。
具体工厂(ConcreteCreator):具体工厂,实现抽象工厂定义的结构。每个具体工厂负责创建此系列(产品族)下的商品。
抽象产品(ProductA和ProductB):产品抽象,定义一个抽象产品。
具体产品(ProductA1、ProductA2、ProductB1和ProductB2):具体产品。
如果使用微型计算机例子,则类图如下:
![](https://img-blog.csdn.net/20130806174337000?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3hoMTUyNw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
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,增加新的产品等级结构,需要抽象工厂,并且修改所有的具体工厂,不支持开闭原则。
所以:抽象工厂模式,为增加新的产品族提供方便,不能对对增加产品等级结构,适用于产品等级结构明确的系统。