Java中原型模式配合Cloneable接口实现克隆,需实现Cloneable标记接口并重写public clone()方法调用super.clone()完成浅拷贝;深拷贝须手动克隆引用类型字段,配合原型模式可高效创建配置复杂对象。

在Java中用原型模式配合Cloneable接口克隆对象,核心是让类实现Cloneable并重写clone()方法,再通过调用super.clone()完成浅拷贝;若需深拷贝,需手动处理引用类型字段。
实现Cloneable接口并重写clone方法
Cloneable是个标记接口,不包含任何方法。它只是告诉JVM该类允许被克隆。如果不实现它就调用clone(),会抛出CloneNotSupportedException。
必须将clone()方法的访问权限设为public(父类中是protected),否则外部无法调用。
- 在类声明中添加
implements Cloneable - 重写
public Object clone() throws CloneNotSupportedException - 方法体内调用
super.clone(),这是JVM提供的默认浅拷贝逻辑
区分浅拷贝与深拷贝
默认super.clone()只复制对象本身和基本类型字段,对引用类型(如List、自定义对象等)仅复制引用地址——这就是浅拷贝。如果原对象修改了某个引用对象的内容,克隆体也会“看到”变化。
要实现深拷贝,需在clone()方法中对每个引用字段单独克隆:
- 对数组:用
Arrays.copyOf()或循环克隆每个元素 - 对集合:新建集合,遍历原集合并克隆每个元素后加入
- 对自定义对象字段:确保该字段类型也支持克隆(实现了
Cloneable且重写了clone()),然后调用其clone()
避免常见陷阱
直接调用Object.clone()可能抛异常,务必捕获或声明CloneNotSupportedException;推荐在重写方法中直接抛出运行时异常,避免上层强制处理。
- 不要在
clone()里调用构造方法——克隆不是创建新实例,而是复制已有状态 - 若类有final字段,注意它们不能在
clone()中重新赋值(除非是基本类型或不可变对象) - 若继承自未实现
Cloneable的父类,需确认父类是否允许克隆,否则super.clone()会失败
配合原型模式组织克隆逻辑
原型模式本质是用一个“原型实例”作为模板,通过克隆生成新对象,避免重复new和初始化。适合创建成本高、配置复杂或运行时才确定类型的对象。
可以定义一个通用原型接口或抽象基类,统一管理克隆行为:
- 定义
Prototype接口,声明clone()方法(返回泛型T更安全) - 具体类实现该接口,并完成自己的克隆逻辑
- 用工厂类或注册表维护常用原型,按需克隆,而非每次都new
这样既解耦了对象创建过程,又保留了克隆的灵活性和性能优势。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











