#ifndef ABSTRACT_FACTORY_H_
#define ABSTRACT_FACTORY_H_
//创建抽象产品
class AbstractProductOne
{
public:
virtual voidCreateOne()=0;
};
class AbstractProductTwo
{
public:
virtual voidCreateTwo()=0;
};
//生产实际的产品
class ProductOneA:public AbstractProductOne
{
public:
voidCreateOne();
};
class ProductOneB:public AbstractProductOne
{
public:
voidCreateOne();
};
class ProductTwoA:public AbstractProductTwo
{
public:
voidCreateTwo();
};
class ProductTwoB:public AbstractProductTwo
{
public:
voidCreateTwo();
};
//创建抽象工厂
class AbstractFactory
{
public:
virtualAbstractProductOne *CreateProductOne() =0;
virtualAbstractProductTwo *CreateProductTwo() =0;
};
//创建实际的工厂
class FactoryA:public AbstractFactory
{
public:
AbstractProductOne *CreateProductOne();
AbstractProductTwo *CreateProductTwo();
};
class FactoryB:public AbstractFactory
{
public:
AbstractProductOne *CreateProductOne();
AbstractProductTwo *CreateProductTwo();
};
#endif
//实现文件
#include "AbstractFactory.h"
#include <iostream>
using namespace std;
void main()
{
AbstractFactory*Factory1 =new FactoryA;
Factory1->CreateProductOne()->CreateOne();
Factory1->CreateProductTwo()->CreateTwo();
AbstractFactory*Factory2 =new FactoryB;
Factory2->CreateProductOne()->CreateOne();
Factory2->CreateProductTwo()->CreateTwo();
}
从工厂方法模式到抽象工厂模式是这个模式的一个应用扩展,与之前工厂方法想比较而言,抽象工厂模式多了一个产品族的概念。工厂方法模式中,只有一个产品等级结构,而在抽象工厂模式中,就有多个产品等级结构。
产品族和等级结果是两种不同的对产品的划分方式,比如说一个生产鞋子的工厂,不同的鞋码是一个产品等级,但是男士鞋和女士鞋以及儿童鞋这属于不同的产品族划分。通过产品族和生产等级结构进行相互配合,从而生产出了你要求的某种款式和鞋码的鞋子。
下面是抽象工厂模式的通用类图。
与工厂方法模式相比,工厂方法模式中,每增加一类产品就需要增加一个实现的工厂。而抽象工厂的最大优点就是避免了频繁的增加实现工厂的缺陷。抽象工厂如果要增加一个新产品,只需要在基类中添加一个接口,即可以完成对新产品的生产。同时,生产出来的新产品可以沿用之前的产品族和生产等级结构。
因此,抽象工厂就是针对这种产品中有多种分类方法,而工厂方法又不能够很好进行解决而诞生的。工厂方法针对于某单一种类的生产等级结构是很方便的,但是对于这种存在多样化的生产方式,就会存在问题。
下面是一个实现的例子:
最后的实现效果如下:
抽象工厂对于繁多的产品种类情况下就能够很好的实现,其实在很多实际的生产中都是采用这种抽象工厂模式的。