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;
}
=== 陆路物流方案 ===
陆路运输:卡车正在运送货物
=== 海路物流方案 ===
海路运输:货轮正在运送货物