抽象工厂模式(Abstratct Factory):提供一个创建一系列相关或相互依赖的对象的接口,而无需指它们具体的类。
下面是抽象工厂模式的UML图:
下面是C++实现的代码:
/*
* initm.com
* 作者:Stupid
* 时间:2017-10-30 20:58
* 描述: 代码使用QT5.9+MinGW53_32编译通过,代码为抽象工厂模式的基本结构代码。
*/
#include <QCoreApplication>
#include <cstdlib>
#include <iostream>
class AbstractProductA
{
public:
virtual void printType()=0;
};
class ProductA1: public AbstractProductA
{
public:
void printType()override final{
std::cout << "ProductA1" << std::endl;
}
};
class ProductA2: public AbstractProductA
{
public:
void printType()override final{
std::cout << "ProductA2" << std::endl;
}
};
class AbstractProductB
{
public:
virtual void printType() = 0;
};
class ProductB1: public AbstractProductB
{
public:
void printType()override final{
std::cout << "ProductB1" << std::endl;
}
};
class ProductB2: public AbstractProductB
{
public:
void printType()override final{
std::cout << "ProductB2" << std::endl;
}
};
class AbstractFactory
{
public:
virtual AbstractProductA* CreateProductA() = 0;
virtual AbstractProductB* CreateProductB() = 0;
};
class ConcreteFactory1: public AbstractFactory
{
public:
AbstractProductA* CreateProductA()override final{
return new ProductA1;
}
AbstractProductB* CreateProductB()override final{
return new ProductB1;
}
};
class ConcreteFactory2: public AbstractFactory
{
public:
AbstractProductA* CreateProductA()override final{
return new ProductA2;
}
AbstractProductB* CreateProductB()override final{
return new ProductB2;
}
};
int main(int argc, char *argv[])
{
system("chcp 65001");
QCoreApplication a(argc, argv);
AbstractFactory* pFactory = new ConcreteFactory1;
AbstractProductA* pProductA = pFactory->CreateProductA();
pProductA->printType();
AbstractProductB* pProductB = pFactory->CreateProductB();
pProductB->printType();
return a.exec();
}
抽象工厂模式可以说是相当符合开放封闭原则了,书中还用了C#中的反射,在C++中没有反射,那么我们可以通过预编译指令来实现类似的功能。