工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品;在工厂中加工产品,使用产品的人,不用在乎产品是如何生产出来的。从软件开发的角度来说,这样就有效的降低了模块之间的耦合。
对于工厂模式,具体上可以分为三类:
对于上面的三种工厂模式,从上到下逐步抽象,并且更具一般性。而这篇博文主要讲的是简单工厂模式,后两种会在之后的博文中接着总结。
上图中,BaseProduct是虚基类,有一个纯虚函数show
ProductA,ProductB,ProductC都是继承BaseProduct类
Factory类,通过createProduct函数,生成ProductA,ProductB,ProductC类的对象
适用场合
(1) 在程序中,需要创建的对象很多,导致对象的new操作多且杂时,需要使用简单工厂模式;
(2) 由于对象的创建过程是我们不需要去关心的,而我们注重的是对象的实际操作,所以,我们需要分离对象的创建和操作两部分,如此,方便后期的程序扩展和维护。
注意:由于作者是一个Qt开发者,对Qt比较熟悉,所以,所有的代码都是采用QtCreator编译器,MinGW开发环境。
代码:
#include <QCoreApplication>
#include <iostream>
#include <vector>
using namespace std;
typedef enum ProductTypeTag
{
TypeA,
TypeB,
TypeC
} PRODUCTTYPE;
// 产品基类
class BaseProduct
{
public:
virtual void Show() = 0;
};
class ProductA : public BaseProduct
{
public:
void Show()
{
cout << "I'm ProductA" << endl;
}
};
class ProductB : public BaseProduct
{
public:
void Show()
{
cout << "I'm ProductB" << endl;
}
};
class ProductC : public BaseProduct
{
public:
void Show()
{
cout << "I'm ProductC" << endl;
}
};
// 工厂类
class Factory
{
public:
BaseProduct* CreateProduct(PRODUCTTYPE type)
{
switch (type)
{
case TypeA:
return new ProductA();
case TypeB:
return new ProductB();
case TypeC:
return new ProductC();
default:
return nullptr;
}
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 创建一个工厂对象
Factory *ProductFactory = new Factory();
BaseProduct *productObjA = ProductFactory->CreateProduct(TypeA);
if (productObjA != nullptr)
productObjA->Show();
BaseProduct *productObjB = ProductFactory->CreateProduct(TypeB);
if (productObjB != nullptr)
productObjB->Show();
BaseProduct *productObjC = ProductFactory->CreateProduct(TypeC);
if (productObjC != nullptr)
productObjC->Show();
delete ProductFactory;
ProductFactory = nullptr;
delete productObjA;
productObjA = nullptr;
delete productObjB;
productObjB = nullptr;
delete productObjC;
productObjC = nullptr;
return a.exec();
}