<aside> 💡

工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类

</aside>

结构图

image.png

例子

image.png

工厂方法模式 vs. 简单工厂

题目

https://kamacoder.com/problempage.php?pid=1076

#include <iostream>
#include <string>
using namespace std;

// 抽象产品类
class Product{
public:
    virtual void productBlock(){};
};

// 具体产品类
class CircleProduct: public Product{
public:
    CircleProduct(int n): m_n(n){};
    void productBlock() override {
        for(int i = 0; i < m_n; ++i){
            cout << "Circle Block" << endl;
        }
    }
private:
    int m_n;
};

class SquareProduct: public Product{
public:
    SquareProduct(int n): m_n(n){};
    void productBlock() override {
        for(int i = 0; i < m_n; ++i){
            cout << "Square Block" << endl;
        }
    }
private:
    int m_n;
};

// 抽象工厂类(一个接口)
class IFactory{
public:
    // 接口中只有一个创建抽象产品的工厂方法 
    virtual Product* createBlock(int n) = 0;
};

// 具体工厂类
class CircleFactory: public IFactory{
public:
    CircleProduct* createBlock(int n) override {
        return new CircleProduct(n);
    }
};

class SquareFactory: public IFactory{
public:
    SquareProduct* createBlock(int n) override {
        return new SquareProduct(n);
    }
};

int main(){
    int n;
    cin >> n;

    for(int i = 0; i < n; ++i){
        string blockType;
        int blockNum;
        cin >> blockType >> blockNum;
        
        IFactory* factory = nullptr;
        Product* product = nullptr;
        // 根据客户端的选项创建对应的工厂对象
        if(blockType == "Circle"){
            factory = new CircleFactory();
        }else if(blockType == "Square"){
            factory = new SquareFactory();
        }else{
            cout << "请输入正确的积木类型" << endl;
            --i;
            continue;
        }
        // 使用工厂对象创建产品
        product = factory->createBlock(blockNum);
        // 使用产品
        product->productBlock();

        delete factory;
        delete product;
    }

    return 0;
}