1.定义
通过复制现有的对象来创建新的对象
2.实现
- 实现Cloneable接口
- Cloneable接口可以通知JVM在运行时安全的让实现此接口的类使用clone方法。如果没有实现Cloneable接口,使用clone方法,JVM会在运行时抛出CloneNotSupportException异常
- 重写Object类的clone方法
- Object类是所有Java类的父类,其中有一个clone方法,作用是返回对象的一个拷贝。但此方法的作用域是protected,需要重写,将作用域改为public
- 代码
实体类
class Mail implements Cloneable{
private String name;
@Override
public Mail clone() {
Mail mail = null;
try {
mail = (Mail)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return mail;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
测试 --输出false
public class Clone {
public static void main(String[] args) {
Mail mail = new Mail();
mail.setName("wl");
int i =1;
Mail mailclone = null;
mailclone = mail.clone();
System.out.println(mail == mailclone);
}
}
优点
- clone方法直接操纵底层二进制流创建对象,比new一个对象要快。特别是复制大对象时,效果更加明显
- 隐藏了创建新对象的复杂性
缺点
- 由于复制对象是没有调用构造方法,无法和单例模式同时使用。单例模式对象是private的,原型模式是public
- 原型模式不能有final对象
- clone方法只会拷贝对象中的基本数据类型和属性,对于引用类型和数组不会拷贝。需要另行拷贝。clone方法是浅拷贝。
适用场景
- 需要创建的对象比较大
- 对目标对象的修改不会影响原有的对象