工厂模式必须返回引用类型以实现运行时多态,即通过接口/基类引用调用子类方法,使客户端代码解耦于具体实现。典型应用包括数据库连接器、日志记录器和StatusDebouncer等场景,需注意避免返回栈地址、优先使用智能指针或接口引用,并确保工厂方法签名声明抽象返回类型。

引用数据类型的工厂模式应用,核心在于用工厂统一管理对象实例的创建,避免客户端直接 new 具体类,从而解耦调用逻辑与具体实现。尤其当产品是接口、抽象类或基类的引用类型(如 Shape*、Product、IStatusDebouncer)时,工厂返回的是多态引用,调用方只依赖抽象,不感知底层类型。
为什么必须返回引用类型?
工厂模式的价值在运行时多态——返回抽象类型(接口/基类)的引用或指针,才能让同一段调用代码适配不同子类行为。比如:
- C++ 中返回
Shape*或std::unique_ptr<Shape>,而非Circle实例本身; - Java/C# 中返回
Product接口引用,而非ProductA具体类; - Python 中返回实现了统一协议(如
draw()方法)的类实例,类型标注为Protocol或抽象基类。
典型应用场景中的引用类型使用
常见于需动态切换实现、配置驱动或插件化扩展的系统:
HTML5技术开发服务解决公司网站模板是一款提供为企业提供服务和解决方案的公司宣传网站模板下载。提示:本模板调用到谷歌字体库,可能会出现页面打开比较缓慢。
-
数据库连接器:工厂根据配置("MySQL" / "PostgreSQL")返回
DatabaseConnection接口引用,上层只调用connect(),不关心内部是 JDBC 还是 psycopg2; -
日志记录器:工厂依据日志级别或输出目标(文件/网络/控制台)返回
Logger引用,业务代码统一调用log(message); -
StatusDebouncer:如资料中所示,
StatusDebouncerFactory根据枚举DebouncerMode.CountBased返回IStatusDebouncer引用,策略变化不影响状态处理主流程。
工厂返回引用时的关键细节
确保安全性和语义清晰,需注意:
- 避免返回栈对象地址(C++ 中不能 return local object’s pointer);
- 优先用智能指针(
std::shared_ptr<T>/std::unique_ptr<T>)或接口引用(Java/C# 的interface),明确所有权和生命周期; - 工厂方法签名应声明返回抽象类型,例如:
virtual std::unique_ptr<Shape> createShape(const std::string&) = 0;; - 客户端代码始终通过引用/指针调用虚函数,触发动态绑定,否则多态失效。
简单工厂 vs 工厂方法中的引用处理差异
两者都返回引用类型,但封装粒度不同:
-
简单工厂:单个类含条件分支,返回
Shape*,适合产品种类少、逻辑稳定; -
工厂方法:每个子类工厂(
CircleFactory、RectangleFactory)各自重写create(),返回std::unique_ptr<Shape>,更易扩展且符合开闭原则。

















