作用:
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
解析:
Abstract Factory模式和Factory最大的差别就是抽象工厂创建的是一系列相关的对象,其中创建的实现其实采用的就是Factory模式的方法,对于某个实现的有一个派生出来的抽象工厂,另一个实现有另一个派生出来的工厂。
AbstractFactory.h
class AbstractProductA
{
public:
AbstractProductA() {}
virtual ~AbstractProductA(){}
};
class ConcreateProductA1
: public AbstractProductA
{
public:
ConcreateProductA1(){}
virtual ~ConcreateProductA1(){}
};
class ConcreateProductA2
: public AbstractProductA
{
public:
ConcreateProductA2(){}
virtual ~ConcreateProductA2(){}
};
class AbstractProductB
{
public:
AbstractProductB() {}
virtual ~AbstractProductB(){}
};
class ConcreateProductB1
: public AbstractProductB
{
public:
ConcreateProductB1(){}
virtual ~ConcreateProductB1(){}
};
class ConcreateProductB2
: public AbstractProductB
{
public:
ConcreateProductB2(){}
virtual ~ConcreateProductB2(){}
};
class AbstractFactory
{
public:
AbstractFactory(){}
virtual ~AbstractFactory(){}
virtual AbstractProductA* CreateProductA() = 0;
virtual AbstractProductB* CreateProductB() = 0;
};
class ConcreateFactory1
: public AbstractFactory
{
public:
ConcreateFactory1(){}
virtual ~ConcreateFactory1(){}
virtual AbstractProductA* CreateProductA();
virtual AbstractProductB* CreateProductB();
};
class ConcreateFactory2
: public AbstractFactory
{
public:
ConcreateFactory2(){}
virtual ~ConcreateFactory2(){}
virtual AbstractProductA* CreateProductA();
virtual AbstractProductB* CreateProductB();
};
AbstractFactory.cpp
#include "AbstractFactory.h"
AbstractProductA* ConcreateFactory1::CreateProductA()
{
return new ConcreateProductA1();
}
AbstractProductB* ConcreateFactory1::CreateProductB()
{
return new ConcreateProductB1();
}
AbstractProductA* ConcreateFactory2::CreateProductA()
{
return new ConcreateProductA2();
}
AbstractProductB* ConcreateFactory2::CreateProductB()
{
return new ConcreateProductB2();
}
main.cpp
#include "AbstractFactory.h"
int main(int argc, char* argv[])
{
ConcreateFactory1 *pFactory1 = new ConcreateFactory1;
AbstractProductA *pProductA = pFactory1->CreateProductA();
delete pFactory1;
delete pProductA;
ConcreateFactory2 *pFactory2 = new ConcreateFactory2;
AbstractProductB *pProductB = pFactory2->CreateProductB();
delete pFactory2;
delete pProductB;
return 0;
}