用於建立重複的對象,同時又能保證性能。通俗的講,原型模式就是克隆對象,直接copy字節碼,不走構造方法,性能很是高。ORM中常常用到。java
只支持9種數據類型的深拷貝: 8大基本類型(int long float double boolean char short byte )
+String
其餘(List等)數據類型默認都是淺拷貝,可是咱們也能經過他們自身的clone方法來深拷貝。bash
List list = new ArrayList();
List cloneList = (List) ((ArrayList) list).clone();
複製代碼
實現Cloneable接口,而且重寫clone()方法。ide
public class Prototype implements Cloneable{
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
複製代碼
注:若是不實現該接口而直接調用clone()方法會拋出CloneNotSupportedException異常性能
人原型,用來作被拷貝的對象。ui
public class PeoplePrototype extends Prototype{
private int age;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
複製代碼
public class Main {
public static void main(String[] args) {
PeoplePrototype prototype = new PeoplePrototype();
prototype.setAge(20);
prototype.setName("FantJ");
try {
PeoplePrototype clone = (PeoplePrototype)prototype.clone();
System.out.println(clone.getAge());
System.out.println(clone == prototype);
System.out.println(clone+" "+prototype);
System.out.println(clone.getClass() +" "+ prototype.getClass());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
複製代碼
控制檯打印:this
20
false
com.fantj.prototype.ConcretePrototype@6d6f6e28 com.fantj.prototype.ConcretePrototype@135fbaa4
class com.fantj.prototype.ConcretePrototype class com.fantj.prototype.ConcretePrototype
複製代碼