1.原型模式定义:
原型模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。用这种方式创建对象非常高效,根本无须知道对象创建的细节。
2.细节:
- 抽象原型类:规定了具体原型对象必须实现的接口。
- 具体原型类:实现抽象原型类的
clone
方法。
如果没有实现Cloneable接口则会抛异常:java.lang.CloneNotSupportedException
源码中解释如下:
Invoking Object's clone method on an instance that does not implement the Cloneable interface results in the exception CloneNotSupportedException being thrown.
代码实例:
(一)
@Data
public class People implements Cloneable{
private String name;
private String addr;
}
(二)
import lombok.Data;
@Data
public class Employee extends People {
private Long salary;
public Employee() {
super();
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
(三)
class TestEmp {
public static void main(String[] args) throws CloneNotSupportedException {
Employee employee = new Employee();
Object o = employee.clone();
System.out.println(o instanceof Employee);
}
}
运行结果:
------------------
true
-------------------
为此我们再来看一个问题,我们看Employee中重写的clone()方法:
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
有没有这样一个疑问:我操,我调用的是父类的clone()然后他返回的是一个object对对象,可是当我判断:
System.out.println(o instanceof Employee);的时候他竟然输出的是true,why???
答:Object中的clone执行的时候使用了RTTI(run-time type identification)的机制,动态得找到目前正在调用 clone方法的那个reference,根据它的大小申请内存空间,然后进行bitwise的复制,将该对象的内存空间完全复制到新的空间中去,从而达 到shallowcopy的目的。(参考博客:https://blog.csdn.net/naughty610/article/details/5307755)
关于克隆,他到底是怎么克隆的呢?