最简单的工厂方法模式(Factory Method Pattern) 的实现,代码简洁、结构清晰,只保留核心要素,便于理解。
核心思想
- 定义一个创建对象的接口,但让子类决定实例化哪个类。
- 父类负责定义流程,子类负责具体对象的创建。
// 创建者基类(定义工厂方法)
class Creator {
public:
// 工厂方法:由子类实现
virtual std::unique_ptr<Product> createProduct() = 0;
// 使用产品(模板方法)
void doSomething() {
auto product = createProduct(); // 调用工厂方法创建对象
if (product) {
product->show();
}
}
virtual ~Creator() = default;
};
// 具体创建者 A:创建 ProductA
class ConcreteCreatorA : public Creator {
public:
std::unique_ptr<Product> createProduct() override {
return std::make_unique<ProductA>();
}
};
// 具体创建者 B:创建 ProductB
class ConcreteCreatorB : public Creator {
public:
std::unique_ptr<Product> createProduct() override {
return std::make_unique<ProductB>();
}
};
// 创建者 A 创建产品 A
ConcreteCreatorA creatorA;
creatorA.doSomething(); // 输出: 这是产品 A
进阶-使用模板实现的最简工厂方法模式,避免了继承和虚函数,实现编译时多态,更加高效和简洁。
- 用模板实现工厂方法模式的核心思想
- 不使用虚函数,性能更高
- 依然保持“创建与使用分离”的设计原则
// 完全泛型的工厂方法
template <typename T>
class GenericCreator {
public:
template <typename... Args>
std::unique_ptr<T> create(Args&&... args) {
return std::make_unique<T>(std::forward<Args>(args)...);
}
};
// 使用
GenericCreator<ProductA> factory;
auto obj = factory.create(); // 创建 ProductA
obj->show();