原型模式与简单工厂模式可结合使用但不可合并:工厂负责类型分发与决策,原型负责高效克隆预配置实例;工厂持有一组原型对象,根据参数选取并调用clone()返回新实例,二者分工明确、协作互补。

原型模式和简单工厂模式是两种不同目的的设计模式,不能直接“合并”成“基于原型的简单工厂模式”。但你可以将二者结合使用:用原型管理对象创建,再由简单工厂统一调度——这种组合不是标准模式,而是实用变体。
先明确两者的分工
原型模式解决的是“如何高效复制已有对象”的问题,适合初始化开销大、状态复杂的实例;简单工厂模式解决的是“根据参数选择并返回某类对象”的问题,核心是逻辑分发与解耦。两者可协作,但原型不替代工厂的决策职责。
典型结合方式:工厂返回克隆后的原型实例
不直接 new 具体类,而是维护一组已配置好的原型对象,工厂根据参数从中选取一个并调用 clone():
- 定义抽象原型接口(如
IProduct),声明Clone()方法 - 实现多个具体原型类(如
ReportTemplateA、ReportTemplateB),均支持深/浅克隆 - 工厂类持有一组预创建的原型实例(静态字段或依赖注入),
Create(string type)方法查找对应原型并返回其克隆 - 客户端只与工厂交互,完全不知晓克隆细节
为什么不用原型代替工厂逻辑?
原型本身不具备“识别类型并分发”的能力。比如传入 "pdf",原型不会自动知道该返回哪个实例——这个判断仍需工厂完成。强行让原型承担类型路由,会破坏单一职责,也违背原型模式本意。
实际编码注意点
在 C# 或 Java 中需确保:
- 原型类正确实现 ICloneable / Cloneable 并处理引用字段(避免浅克隆引发共享状态)
- 工厂中缓存的原型应是“干净模板”,不可被客户端修改后影响后续克隆
- 若原型状态需运行时配置,可在克隆后通过工厂提供初始化方法(如 Configure(result, config))











