原型模式通常比new更快,尤其构造复杂时可省50%+时间;但简单对象差异微乎其微,深克隆开销可能抵消收益;语义和维护性应优先于微秒级性能优化。

原型模式通常比用 new 关键字创建对象更快,尤其在对象构造逻辑复杂、依赖较多或需频繁实例化时;但简单对象下差异微乎其微,甚至可能因原型缓存开销略慢。
构造成本决定效率差距的核心
用 new 创建对象会完整执行构造函数:分配内存 → 调用构造器 → 初始化字段 → 执行自定义逻辑(如 I/O、计算、依赖注入等)。而原型模式通过克隆已有实例(浅拷贝或深拷贝),跳过构造函数执行和部分初始化步骤。
- 若构造函数只做简单赋值(如 new User("a", 18)),new 几乎无额外开销,原型优势不明显
- 若构造涉及数据库连接、配置加载、树形结构构建等重操作,原型克隆可节省 50%+ 时间
- 注意:深克隆本身有成本(如序列化/反序列化、递归遍历),过度嵌套对象可能抵消原型收益
内存与 GC 压力的不同表现
new 每次都产生新对象,GC 频繁时易触发 Minor GC;原型模式复用基础结构,可减少短期对象数量。
- 适合高并发短生命周期场景(如游戏帧对象、HTTP 请求上下文)
- 但原型对象若长期持有大缓存或未清理的引用,反而导致内存泄漏
- Java 中 clone() 默认是浅拷贝,引用字段共享,省空间但需小心状态污染
语言与实现方式显著影响结果
原型效率不是绝对的,取决于语言特性和具体实现:
- JavaScript 天然基于原型,Object.create(proto) 比 new Constructor() 更轻量
- Java 中实现 Cloneable 接口并重写 clone(),性能通常优于 new + 初始化逻辑
- C# 的 MemberwiseClone() 是浅拷贝,快;但手动深克隆或用 JSON 序列化则慢得多
- 部分框架(如 Spring)对 prototype bean 的创建做了优化,实际差异已缩小
何时该选哪种方式?
别为微秒级差异过早优化,优先看语义和维护性:
- 对象状态固定、创建开销大 → 选原型模式(如配置模板、默认报表样式)
- 每次都需要干净隔离的实例,且构造简单 → 直接 new 更清晰、安全
- 不确定时,先用 new;压测发现构造成为瓶颈,再考虑原型 + 缓存策略
- 警惕“伪原型”:只是把 new 封装进工厂方法,没跳过构造流程,不提升效率










