1 定義
原型模式以一個已經(jīng)存在的對象為模板,通過復(fù)制來創(chuàng)建和原型相同或相近的對象檀蹋。
2 使用場景
在某些系統(tǒng)中,需要創(chuàng)建大量的相同或者相似的對象贸桶,并且創(chuàng)建對象的開銷很大桌肴,使用原型復(fù)制的方法則會高效很多。
3 優(yōu)缺點
優(yōu)點:以復(fù)制的方式實現(xiàn)拷貝坠七,簡化了對象的創(chuàng)建旗笔。
缺點:對于復(fù)雜的對象需要手動實現(xiàn)深拷貝拄踪,當原型類發(fā)生改變時,需要更改深拷貝方法惶桐,違背開閉原則。
4 實現(xiàn)
淺拷貝
在Java中實現(xiàn)Cloneable
接口后姚糊,就可以調(diào)用對象.clone()方法就能實現(xiàn)淺拷貝
class Person implements Cloneable{
public String name;
public Person(String name){
this.name = name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class ShallowCopy {
public static void main(String[] args) {
Person zhang = new Person("zhangsan");
try {
Person zhou = (Person) zhang.clone();
System.out.println(zhou.name == zhang.name);
// 輸出true
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
可以看到成員name時String類型對象救恨,這里只實現(xiàn)的淺拷貝。
深拷貝
class Person implements Cloneable{
public String name;
public Person(String name){
this.name = name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Person person = (Person) super.clone();
// new String 新設(shè)工程String對象
person.name = new String(person.name);
return person;
}
}
public class ShallowCopy {
public static void main(String[] args) {
Person zhang = new Person("zhangsan");
try {
Person zhou = (Person) zhang.clone();
System.out.println(zhang.name == zhou.name);
// 輸出true
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}