01 简单工厂模式

工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品;在工厂中加工产品,使用产品的人,不用在乎产品是如何生产出来的。从软件开发的角度来说,这样就有效的降低了模块之间的耦合。

对于工厂模式,具体上可以分为三类:

对于上面的三种工厂模式,从上到下逐步抽象,并且更具一般性。而这篇博文主要讲的是简单工厂模式,后两种会在之后的博文中接着总结。

上图中,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();
}