1. C++工厂模式概览
1.1 角色与职责
在工厂模式中,核心目标是让创建对象的逻辑与使用对象的代码解耦。通过引入产品接口和一个或多个创建者,客户端不需要了解具体的实现类,从而实现解耦和可扩展性。
典型的设计包括四个角色:Product接口、ConcreteProduct实现、Creator抽象类/接口、以及 ConcreteCreator 的具体实现。通过多态,客户端在运行时选择不同的ConcreteProduct,从而实现灵活的产品创建策略。
2. 常见实现变体与要点
2.1 静态工厂函数
静态工厂函数通过一个静态方法来返回一个Product对象,通常不需要客户端显式创建工厂对象。此方式简单、易于使用,但对扩展性与测试性有一定影响,因为缺少可替换的创建者层。
优点:实现简单、调用方便;缺点:难以在运行时替换创建逻辑。静态工厂通常用于小型场景或风格化的工厂方法。
2.2 工厂方法模式
工厂方法模式通过在Creator中定义一个factoryMethod,由子类实现具体的产品创建逻辑。客户端通过Creator的抽象接口进行交互,从而实现可扩展性和开闭原则。

该模式的关键点在于:创建职责下沉到子类,而客户端仅依赖于Product接口,降低了对具体实现的耦合。
2.3 抽象工厂模式
抽象工厂模式进一步把“创建一系列相关对象”作为一个工作单元来实现,通常会提供一个工厂族来生产不同系列的产品。这对于需要同时提供同系列产品的场景尤为合适。
要点:确保同一系列的对象彼此匹配、接口保持一致;通过组合多个ConcreteFactory来生成对应的ConcreteProduct族,从而实现族级一致性。
3. 完整代码示例:C++工厂方法实现
本示例展示了一个典型的工厂方法模式在 C++ 中的完整实现。包含Product接口、具体产品、抽象创建者以及具体创建者,演示如何在运行时通过工厂方法返回不同的产品对象,并使用智能指针实现资源安全管理。
通过该实现可以看到解耦客户端代码与具体实现、多态在运行时的协作,以及如何通过简单扩展增加新产品而不修改现有客户端。
#include <iostream>
#include <memory>
#include <string>class Product {
public:virtual void info() const = 0;virtual ~Product() = default;
};class ConcreteProductA : public Product {
public:void info() const override {std::cout << "Using ConcreteProductA" << std::endl;}
};class ConcreteProductB : public Product {
public:void info() const override {std::cout << "Using ConcreteProductB" << std::endl;}
};class Creator {
public:virtual std::unique_ptr<Product> factoryMethod() = 0;void anOperation() {auto product = factoryMethod();// 解耦:客户端只依赖 Product 接口product->info();}virtual ~Creator() = default;
};class ConcreteCreatorA : public Creator {
public:std::unique_ptr<Product> factoryMethod() override {return std::make_unique<ConcreteProductA>();}
};class ConcreteCreatorB : public Creator {
public:std::unique_ptr<Product> factoryMethod() override {return std::make_unique<ConcreteProductB>();}
};int main() {ConcreteCreatorA creatorA;creatorA.anOperation(); // 使用 Product AConcreteCreatorB creatorB;creatorB.anOperation(); // 使用 Product Breturn 0;
}
资源管理:在示例中使用std::unique_ptr<Product>实现自动化生命周期管理,避免手动释放带来的风险。


