模式动机:工厂方法模式一般针对的是一个产品等级结构(如仅生产电视机),而抽象工厂模式针对的是多个产品等级结构(如不仅生产电视机,还生产空调)。
模式定义:一个具体工厂可以创建一个产品族的所有产品,又称为Kit模式。
模式结构图:
模式代码:
bt_抽象工厂模式.h:
#ifndef AFP_H
#define AFP_H
#include <iostream>
/*
抽象产品接口
*/
class AbstractProductA
{
public:
virtual ~AbstractProductA(){ };
};
class AbstractProductB
{
public:
virtual ~AbstractProductB(){ };
};
/*
具体产品类A
*/
class ConcreteProductA1 : public AbstractProductA
{
public:
ConcreteProductA1();
};
ConcreteProductA1::ConcreteProductA1()
{
std::cout << "创建产品族1中的A" << std::endl;
}
class ConcreteProductA2 : public AbstractProductA
{
public:
ConcreteProductA2();
};
ConcreteProductA2::ConcreteProductA2()
{
std::cout << "创建产品族2中的A" << std::endl;
}
/*
具体产品类B
*/
class ConcreteProductB1 : public AbstractProductB
{
public:
ConcreteProductB1();
};
ConcreteProductB1::ConcreteProductB1()
{
std::cout << "创建产品族1中的B" << std::endl;
}
class ConcreteProductB2 : public AbstractProductB
{
public:
ConcreteProductB2();
};
ConcreteProductB2::ConcreteProductB2()
{
std::cout << "创建产品族2中的B" << std::endl;
}
/*
抽象工厂接口
*/
class AbstractFactory
{
public:
virtual ~AbstractFactory(){ };
virtual AbstractProductA* createProductA() = 0;
virtual AbstractProductB* createProductB() = 0;
};
/*
具体工厂ConcreteFactory1负责生产 "产品族1"
*/
class ConcreteFactory1 : public AbstractFactory
{
public:
virtual AbstractProductA* createProductA();
virtual AbstractProductB* createProductB();
};
AbstractProductA* ConcreteFactory1::createProductA()
{
return new ConcreteProductA1;
}
AbstractProductB* ConcreteFactory1::createProductB()
{
return new ConcreteProductB1;
}
/*
具体工厂ConcreteFactory2负责生产 "产品族2"
*/
class ConcreteFactory2 : public AbstractFactory
{
public:
virtual AbstractProductA* createProductA();
virtual AbstractProductB* createProductB();
};
AbstractProductA* ConcreteFactory2::createProductA()
{
return new ConcreteProductA2;
}
AbstractProductB* ConcreteFactory2::createProductB()
{
return new ConcreteProductB2;
}
#endif // AFP_H
bt_抽象工厂模式.cpp:
#include "bt_抽象工厂模式.h"
#include <iostream>
int main()
{
std::cout << "***** 抽象工厂模式测试 *****" << std::endl;
AbstractFactory* factory = NULL;
AbstractProductA* pa = NULL;
AbstractProductB* pb = NULL;
factory = new ConcreteFactory1;
pa = factory->createProductA();
pb = factory->createProductB();
std::cout << std::endl;
factory = new ConcreteFactory2;
pa = factory->createProductA();
pb = factory->createProductB();
delete pb;
delete pa;
delete factory;
return 0;
}
模式优缺点:
添加新的产品族(即一个新的品牌)比较容易,此时只需要定义新的工厂和产品类即可;但增加产品等级(即原有品牌的种类)比较麻烦,此时必须修改抽象工厂以添加新种类的生产接口,同时所有已有的产品族工厂也要修改,这就违背了“开闭原则”。该模式具体应用中一般适合对象的多种状态同时发生变化时,比如操作系统中的主题管理程序等。
比较:
抽象工厂模式针对的是多个产品等级,而工厂方法模式针对的是一个产品等级,抽象工厂模式经过退化后完全可以变为工厂方法模式,甚至是简单工厂模式。