创建一系列相关或相互依赖的对象(产品族)的接口,而无须指定他们的具体类
1.需要使用很多产品系列中的一个系列,不能几个系列的产品一起用,用该模式可以强制做到这一点。
2.用户只使用抽象工厂以及抽象产品提供的接口,用户不知道具体产品的名字(类名),这些名字不出现在客户端代码中。用户要转换到另一个产品族,只需转换到另一个具体的工厂类就可以了。
3.一般将工厂实现为Singleton
4.与Factory Method的区别:工厂方法中,一个具体的工厂只负责创建一种类型的产品,而抽象工厂中一个具体的工厂要负责一系列的产品(一个产品族)。增加一个新的产品族就要对应增加一个具体的工厂来创建他们。
5.难以支持新种类的产品。如果增加一种抽象产品,也就是在每个产品族中增加另一种产品,这种情况下需要修改抽象工厂的接口(增加一个接口,如CreatAnotherProduct),然后再其所有子类中实现该接口。不满足开闭原则。一种解决办法是让抽象工厂只提供一个接口:Product* AbstractFactory::Creat(String ProductType),用一个参数表明要创建什么产品,如Button,TextField等。但是这样做,对返回的结果需要强制类型转换,即将Product*向下转型到ProductType对应的类型。
6.可以方便的增加一个新的产品族:增加一个新的产品族就要对应增加一个具体的工厂来创建他们。但是增加一个新的种类的产品就比价麻烦。即上述第4、5点。