工厂模式的核心是解耦创建与使用逻辑:简单工厂集中new操作并返回智能指针,适用于稳定场景;工厂方法通过虚函数让子类决定实例化类型,适用于多平台产品系列。

工厂模式的核心是让创建逻辑和使用逻辑解耦
直接用 new 创建对象会让调用方绑定具体类型,一旦新增子类或切换实现,就得改所有创建点。工厂模式把 new 集中到一个地方,使用者只依赖抽象接口,不关心谁被实例化。
实际项目里最常用的是“简单工厂”(非 GoF 原始定义但够用)和“工厂方法”,前者适合产品种类稳定、创建逻辑轻量的场景;后者适合需要子类决定实例化哪个产品的扩展需求。
简单工厂:用一个函数或类封装 new 调用
它不是 GoF 23 种之一,但写起来快、读得懂,90% 的内部工具类场景够用。关键点是返回基类指针(通常是 std::unique_ptr<base>),避免裸指针和内存泄漏。
- 不要返回栈对象(
return Base())——切片问题 - 不要返回裸指针(
new Derived)——调用方难管理生命周期 - 参数建议用枚举或字符串,避免魔法数字:
enum class ProductType { A, B }; - 如果产品构造需要参数,工厂函数也得接收并透传,别在工厂里硬编码
std::unique_ptr<product> createProduct(ProductType type) {
switch (type) {
case ProductType::A: return std::make_unique<producta>();
case ProductType::B: return std::make_unique<productb>();
default: throw std::invalid_argument("unknown product type");
}
}</productb></producta></product>
工厂方法:让子类决定实例化哪个类
当你发现不同模块要创建同一系列产品(比如 WindowsUIFactory / MacUIFactory 各自创建 Button / TextBox),就该用工厂方法。核心是把 createXXX() 声明为虚函数,由子类实现。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 基类工厂必须是抽象类,至少有一个纯虚
create()函数 - 子类工厂里每个
create()都返回对应平台的具体控件,但类型统一为基类指针 - 调用方只持有基类工厂指针,运行时动态绑定——这依赖虚函数表,别忘了
virtual和override - 注意对象所有权:推荐返回
std::unique_ptr,避免子类用new后忘记释放
容易踩的坑:静态多态 vs 动态多态混淆
有人用模板写“编译期工厂”,比如 template<typename t> auto create() { return std::make_unique<t>(); }</t></typename>。这不算工厂模式,只是泛型封装——没有运行时决策,无法根据配置/用户输入切换类型。
另一个常见错误是把工厂本身做成单例。除非明确需要全局唯一工厂实例(如日志器、配置加载器),否则没必要。工厂对象可以按需构造,更易测试和 mock。
真正麻烦的是产品类有复杂构造依赖(比如需要 DatabaseConnection* 或 ConfigReader&)。这时候工厂函数签名会越来越长,建议引入 Builder 模式配合,或者用依赖注入容器——但那是另一层复杂度了。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










