深拷贝在原型模式中要求新对象及其所有嵌套引用类型属性完全独立。实现方式包括:①php手动重写__clone()方法逐层clone;②序列化反序列化(如unserialize(serialize($obj)));③使用第三方库如myclabs/php-deep-copy或apache commons;④构造函数+属性复制。

深拷贝在原型模式中,核心目标是让新对象与原对象完全独立——不仅对象本身是新的,其内部所有引用类型的属性也必须是全新副本,不能共享内存地址。
手动重写 __clone() 方法(PHP)
PHP 默认 clone 是浅拷贝。要实现深拷贝,需在类中定义 __clone() 魔术方法,在其中显式克隆嵌套的对象属性。
- PHP 执行
clone $obj时,先完成默认浅拷贝,再自动调用该方法 - 在 __clone() 中对每个对象类型属性调用
clone,逐层递归处理 - 例如:
$this->address = clone $this->address;,确保子对象也被复制
序列化反序列化(Java / PHP 通用思路)
将对象序列化为字节流或字符串,再反序列化成新对象,天然绕过引用共享,实现完整深拷贝。
- Java 可用
SerializationUtils.clone()(Apache Commons Lang),要求所有字段实现Serializable - PHP 可用
unserialize(serialize($obj)),但注意:资源、闭包、部分内置对象无法序列化 - 该方式无需手动维护克隆逻辑,适合结构较深且稳定的对象
第三方库辅助(如 Java 的 Apache Commons、PHP 的 DeepCopy)
避免重复造轮子,直接使用成熟库处理复杂引用关系和边界情况。
- PHP 推荐
myclabs/php-deep-copy,支持循环引用、闭包、资源句柄等特殊类型 - Java 中
SerializationUtils简单可靠;若需更高性能或更灵活控制,可考虑 Kryo 或 FST - 这些库已封装好递归遍历、类型判断、异常处理等细节,比手写更健壮
构造函数 + 属性复制(通用编程语言)
不依赖语言特性,通过新建实例并逐个复制属性值(对引用类型再调用其 clone 或构造逻辑)来实现。
- 适用于无法修改原类(比如第三方类)或不能序列化的场景
- 需确保所有嵌套对象都支持复制,否则容易遗漏或出错
- 虽然可控性强,但代码量大、易随结构变更而失效,维护成本较高











