1. 工厂模式基础与变体概述
工厂模式是面向对象设计中最为经典的模式之一,它通过将对象创建逻辑封装在单独的类或方法中,实现了创建者与使用者的解耦。在C++这种没有内置反射机制的语言中,工厂模式尤为重要。传统的工厂模式主要分为简单工厂、工厂方法和抽象工厂三种基础形式,但在实际工程实践中,开发者们根据特定场景需求衍生出了多种有价值的变体实现。
工厂模式的核心价值在于应对对象创建的复杂性。当系统中存在大量具有共同接口但实现各异的类,且创建逻辑存在条件分支或复杂初始化过程时,直接使用new运算符会导致客户端代码与具体类实现高度耦合。工厂模式通过引入中间层,使系统在增加新类型时无需修改已有代码,符合开闭原则。
在C++语境下,工厂模式的实现需要考虑语言特性带来的约束与机遇。比如利用模板元编程可以实现编译期工厂,通过智能指针管理对象生命周期可以避免内存泄漏,结合移动语义可以优化对象返回效率。这些特性使得C++中的工厂模式实现比其它语言更为丰富多样。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 经典工厂模式回顾与C++实现
2.1 简单工厂模式
简单工厂通过一个静态方法封装对象创建逻辑,是最直接的工厂实现。典型的C++实现如下:
cpp复制class Product {
public:
virtual ~Product() = default;
virtual void operation() = 0;
};
class ConcreteProductA : public Product {
public:
void operation() override { /*...*/ }
};
class SimpleFactory {
public:
static std::unique_ptr<Product> createProduct(const std::string& type) {
if (type == "A") return std::make_unique<ConcreteProductA>();
if (type == "B") return std::make_unique<ConcreteProductB>();
throw std::invalid_argument("Unknown product type");
}
};
这种实现虽然简单,但存在明显缺陷:每次新增产品类型都需要修改工厂类,违反了开闭原则。适用于产品类型稳定、变化较少的场景。
2.2 工厂方法模式
工厂方法模式将对象创建延迟到子类中实现,解决了简单工厂的扩展性问题:
cpp复制class Creator {
public:
virtual ~Creator() = default;
virtual std::unique_ptr<Product> factoryMethod() const = 0;
void someOperation() const {
auto product = factoryMethod();
product->operation();
}
};
class ConcreteCreatorA : public Creator {
public:
std::unique_ptr<Product> factoryMethod() const override {
return std::make_unique<ConcreteProductA>();
}
};
这种模式的优势在于新增产品类型时只需添加新的Creator子类,无需修改已有代码。但需要为每个产品类创建对应的工厂类,可能造成类数量膨胀。
2.3 抽象工厂模式
抽象工厂用于创建相关或依赖对象的家族,而不需要指定具体类:
cpp复制class AbstractFactory {
public:
virtual ~AbstractFactory() = default;
virtual std::unique_ptr<ProductA> createProductA() = 0;
virtual std::unique_ptr<Produc
