02-工厂方法模式

02.工厂方法模式

1.定义

工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。

2.结构

工厂方法模式包含如下角色:

  • Product:抽象产品
  • ConcreteProduct:具体产品
  • Factory:抽象工厂
  • ConcreteFactory:具体工厂

3.时序图

4.示例

#include <iostream>
#include <memory>

// 步骤1:定义抽象产品类
class Transport {
public:
    virtual void deliver() const = 0;
    virtual ~Transport() = default;
};

// 步骤2:实现具体产品类
class Truck : public Transport {
public:
    void deliver() const override {
        std::cout << "陆路运输:卡车正在运送货物\n";
    }
};

class Ship : public Transport {
public:
    void deliver() const override {
        std::cout << "海路运输:货轮正在运送货物\n";
    }
};

// 步骤3:定义抽象创建者类
class Logistics {
public:
    // 工厂方法(核心)
    virtual std::unique_ptr<Transport> createTransport() const = 0;
    
    void planDelivery() const {
        auto transport = createTransport();
        transport->deliver();
    }
    
    virtual ~Logistics() = default;
};

// 步骤4:实现具体创建者类
class RoadLogistics : public Logistics {
public:
    std::unique_ptr<Transport> createTransport() const override {
        return std::make_unique<Truck>();
    }
};

class SeaLogistics : public Logistics {
public:
    std::unique_ptr<Transport> createTransport() const override {
        return std::make_unique<Ship>();
    }
};

// 客户端代码
int main() {
    std::cout << "=== 陆路物流方案 ===\n";
    RoadLogistics roadLogistics;
    roadLogistics.planDelivery();  // 创建卡车并运输

    std::cout << "\n=== 海路物流方案 ===\n";
    SeaLogistics seaLogistics;
    seaLogistics.planDelivery();   // 创建货轮并运输

    return 0;
}
=== 陆路物流方案 ===
陆路运输:卡车正在运送货物

=== 海路物流方案 ===
海路运输:货轮正在运送货物