UML类图(仅供参考)如下:
抽象工厂模式解决的问题:
一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂,主要解决接口选择的问题
源码
#include <iostream>
#include <string>
// 抽象产品A
class CProductA
{
public:
virtual ~CProductA() {}
virtual void Show() = 0;
};
// 抽象产品B
class CProductB
{
public:
virtual ~CProductB() {}
virtual void Show() = 0;
};
// 产品A1
class CConcreteProductA1 :public CProductA
{
public:
virtual void Show()
{
std::cout << "我是产品A1" << std::endl;
}
};
// 产品A2
class CConcreteProductA2 :public CProductA
{
public:
virtual void Show()
{
std::cout << "我是产品A2" << std::endl;
}
};
// 产品B1
class CConcreteProductB1 :public CProductB
{
public:
virtual void Show()
{
std::cout << "我是产品B1" << std::endl;
}
};
// 产品B2
class CConcreteProductB2 :public CProductB
{
public:
virtual void Show()
{
std::cout << "我是产品B2" << std::endl;
}
};
// 抽象工厂
class CFactory
{
public:
virtual ~CFactory() {}
virtual CProductA *CreateA() = 0;
virtual CProductB *CreateB() = 0;
};
// 工厂1
class CConcreteFactory1 :public CFactory
{
virtual CProductA *CreateA()
{
return new CConcreteProductA1();
}
virtual CProductB *CreateB()
{
return new CConcreteProductB1();
}
};
// 工厂2
class CConcreteFactory2 :public CFactory
{
virtual CProductA *CreateA()
{
return new CConcreteProductA2();
}
virtual CProductB *CreateB()
{
return new CConcreteProductB2();
}
};
int main()
{
CFactory *pFactory = NULL;
CProductA *pProductA = NULL;
CProductB *pProductB = NULL;
pFactory = new CConcreteFactory1();
pProductA = pFactory->CreateA();
pProductB = pFactory->CreateB();
pProductA->Show();
pProductB->Show();
delete pFactory;
delete pProductA;
delete pProductB;
pFactory = new CConcreteFactory2();
pProductA = pFactory->CreateA();
pProductB = pFactory->CreateB();
pProductA->Show();
pProductB->Show();
delete pFactory;
delete pProductA;
delete pProductB;
return 0;
}
好处
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象,方便替换