抽象工厂是为创建一组相关或依赖的对象提供接口,使得一组对象的维护,只需要维护相应的创建对象的工厂类。可以大大提高程序的可维护性。
在如下情况下,应当考虑使用抽象工厂模式:
- 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。
- 这个系统有多于一个的产品族,而系统只消费其中某一产品族。
- 同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。
- 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。
抽象工厂遵循 “开放--封闭” 原则"开放-封闭"原则要求系统对扩展开放,对修改封闭。通过扩展达到增强其功能的目的。对于涉及到多个产品族与多个产品等级结构的系统,其功能增强包括两方面:
增加产品族:Abstract Factory很好的支持了"开放-封闭"原则。
增加新产品的等级结构:需要修改所有的工厂角色,没有很好支持"开放-封闭"原则。
综合起来,抽象工厂模式以一种倾斜的方式支持增加新的产品,它为新产品族的增加提供方便,而不能为新的产品等级结构的增加提供这样的方便。
c++ 实现的抽象工厂的一个简单实例
下载示例代码(vc6 下编译通过) AbstractFactorySample.rar
//---------header file
#include <iostream>
using namespace std;
class BaseProductA
{
protected:
BaseProductA(){};
};
class BaseProductB
{
protected:
BaseProductB(){};
};
class ProductA1:public BaseProductA
{
public:
ProductA1(){cout<<"product A1 is created.."<<endl;};
};
class ProductA2:public BaseProductA
{
public:
ProductA2(){cout<<"product A2 is created.."<<endl;};
};
class ProductB1:public BaseProductB
{
public:
ProductB1(){cout<<"product B1 is created.."<<endl;};
};
class ProductB2:public BaseProductB
{
public:
ProductB2(){cout<<"product B2 is created.."<<endl;};
};
class IFactory
{
protected:
IFactory();
virtual ~IFactory()=0;
public:
virtual BaseProductA* CreateProductA()=0;
virtual BaseProductB* CreateProductB()=0;
};
class ConcreteFactory1:public IFactory
{
public:
ConcreteFactory1(){cout<<"ConcreteFactory1 is created.."<<endl;};
public:
virtual BaseProductA* CreateProductA();
virtual BaseProductB* CreateProductB();
};
class ConcreteFactory2:public IFactory
{
public:
ConcreteFactory2(){cout<<"ConcreteFactory2 is created.."<<endl;};
public:
virtual BaseProductA* CreateProductA();
virtual BaseProductB* CreateProductB();
};
//-----------------------header file end------------------------------------
// -----------------------cpp file--------------------------------
IFactory::IFactory()
{}
IFactory::~IFactory()
{}
BaseProductA* ConcreteFactory1::CreateProductA()
{
return new ProductA1();
}
BaseProductB* ConcreteFactory1::CreateProductB()
{
return new ProductB1();
}
BaseProductA* ConcreteFactory2::CreateProductA()
{
return new ProductA2();
}
BaseProductB* ConcreteFactory2::CreateProductB()
{
return new ProductB2();
}
int main(int argc, char* argv[])
{
IFactory* pFactory1=new ConcreteFactory1();
pFactory1->CreateProductA();
pFactory1->CreateProductB();
IFactory* pFactory2=new ConcreteFactory1();
pFactory2->CreateProductA();
pFactory2->CreateProductB();
getchar();
return 0;
}
//-----------------------cpp file end--------------------------