【C++ 设计模式】1-2.工厂方法模式

255 阅读1分钟
  • 工厂方法模式:一种创建型设计模式


  • 应用场景:

    简单工厂模式之上,考虑到工厂如果新加产品,需要修改产品类型的枚举,并修改工厂生产产品时,对入参类型判断的代码,当然已验证过的代码被修改后也需要重新验证,违反了开闭原则

    于是工厂方法模式登场:

    将生产模式改为一个工厂只专注于生产一种产品。有新产品则创建新工厂,无需改动原本工厂。

  • 实现方式:

    所有工厂继承自工厂抽象类,均可以生产一种产品。

    如果要制作某种产品,就使用该产品所对应的工厂进行生产。

  • 优点:

    新增产品时,无需改动原本代码,新增产品类与工厂类即可,符合开闭原则。

  • 缺点:

    每新增一种产品时,就要增加两个类(产品类和它对应的工厂类),当扩展至大量产品种类时,就会产生大量的类,难于管理。


以下是工厂方法模式的简易代码实现
// FactoryMethod.hpp
#include <iostream>
using namespace std;

// 产品抽象类
class Product {
public:
    virtual void Show() = 0; // 用于验证产品信息
};

class WoodDesk: public Product {
public:	
    void Show() {
        cout << "WoodDesk" << endl;
    }
};

class WoodChair: public Product {
public:
    void Show() {
        cout << "WoodChair" << endl;
    }
};

// 工厂抽象类
class Factory {
public:
    virtual Product* CreateProduct() = 0;
};

class DeskFactory: public Factory {
public:
    Product* CreateProduct() {
        return new WoodDesk();
    }
};

class ChairFactory : public Factory {
public:
    Product* CreateProduct() {
        return new WoodChair();
    }
};
主函数中的使用
#include "FactoryMethod.hpp"

int main()
{
    Factory* FactoryDesk = new DeskFactory();
    Product* DeskWood = FactoryDesk->CreateProduct();
    DeskWood->Show();
 
    Factory* FactoryChair = new ChairFactory();
    Product* ChairWood = FactoryChair->CreateProduct();
    ChairWood->Show();
 
    if (NULL != FactoryDesk) {
        delete FactoryDesk;
        FactoryDesk = NULL;
    }
    if (NULL != FactoryChair) {
        delete FactoryChair;
        FactoryChair = NULL;
    }
    return 0;
}
控制台输出结果
WoodDesk
WoodChair