简介
抽象工厂模式:
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
构成
产品基类:这里包含产品基类A和产品基类B,这两个产品都从共同的基类继承而来,但是这个继承关系却是在这个模式之外的部分,而本身这个模式关心的是这两个产品基类的差异部分。
具体产品类:这里的具体产品类是产品A1,A2,B1、B2等,
工厂抽象接口:定义了创建产品的接口,这里返回参数是返回的产品A,产品B,而本身产品A和B的共同基类,正是这个特征构成了抽象工厂和工厂模式的区别。
具体工厂实现类:工厂1和工厂2。新增加系列,只需新实现一个工厂。
常用的场景
1.一个系统要独立于它的产品的创建、组合和表示时。
2.一个系统要由多个产品系列中的一个来配置时。
3.当你要强调一系列相关的产品对象的设计以便进行联合使用时。
4.当你提供一个产品类库,而只想显示它们的接口而不是实现时。
优点
1. 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易,所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。抽象工厂封装了变化,封装了对象创建的具体细节,对客户端隐藏对象创建的具体细节,符合”封装变化原则”。
2. 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。
3. 增加新的产品族很方便,无须修改已有系统,符合“开闭原则”。
4. 客户端可以针对抽象进行编程,而不需要知道具体类型,符合”针对接口进行编程而不是针对具体进行编程原则”。
缺点
1. 增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了“开闭原则”。
区别
1.简单工厂模式:一个工厂可以生产多个同级产品。
2.工厂模式:多个工厂生产多个同级产品。
3.抽象工厂模式:多个工厂生产多个同级别的产品族, 这些同级别产品族下面还有多个级别的产品.
测试代码
#include <iostream>
#include <assert.h>
#include <vector>
using namespace std;
//抽象产品类
class FBaseProductA
{
};
class FBaseProductB
{
};
//具体产品类
class FProductA1 : public FBaseProductA
{
};
class FProductA2 : public FBaseProductA
{
};
class FProductB1 : public FBaseProductB
{
};
class FProductB2 : public FBaseProductB
{
};
//抽象工厂类
class FBaseFactory
{
public:
virtual FBaseProductA* createProductA();
virtual FBaseProductB* createProductB();
};
//具体工厂类
class FFactoryA : public FBaseFactory
{
public:
FBaseProductA* createProductA(){return new FProductA1();};
FBaseProductB* createProductB(){return new FProductB2();};
};
class FFactoryB : public FBaseFactory
{
public:
FBaseProductA* createProductA(){return new FProductA2();};
FBaseProductB* createProductB(){return new FProductB1();};
};
void main()
{
}