1. 原型模式簡(jiǎn)介
原型模式(Prototype Pattern)是創(chuàng)建型設(shè)計(jì)模式,根據(jù)一個(gè)原型對(duì)象,通過(guò)Clone的方式,創(chuàng)建出一個(gè)新的對(duì)象。
Java的原型模式特別簡(jiǎn)單,一個(gè)類(lèi)只需要實(shí)現(xiàn)Cloneable接口,并且重寫(xiě)(Override)Object類(lèi)中clone方法。
2. 原型模式舉例
原型類(lèi) Person
/**
* 在java虛擬機(jī)中,只有實(shí)現(xiàn)Cloneable接口的類(lèi)才可以被拷貝,
* 否則在運(yùn)行時(shí)會(huì)拋出CloneNotSupportedException異常。
*/
public class Person implements Cloneable{
private int age;
public Person(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
// 淺拷貝
@Override
public Person clone(){
Person person = null;
try {
person = (Person)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return person;
}
}
客戶端類(lèi)
public class PrototypeMain {
public static void main(String[] args) {
Person person = new Person("張三", 18);
// 克隆過(guò)后,可以修改克隆的對(duì)象,變成你想要的對(duì)象
Person copy = person.clone();
// person 和 copy 這2個(gè)對(duì)象的內(nèi)存地址不相等。
System.out.println(person == copy);
}
}
3. 關(guān)于Clone
Java的世界里,創(chuàng)建對(duì)象的方式包括:使用new操作符、反序列化、通過(guò)反射的newInstance方法和Clone方式。
關(guān)于Clone,需要注意的是,Clone方式創(chuàng)建實(shí)例對(duì)象,不會(huì)調(diào)用類(lèi)的構(gòu)造器,不論構(gòu)造器的訪問(wèn)權(quán)限是public還是private,因此,如果單例模式類(lèi)沒(méi)有通過(guò)手段防備,其對(duì)象也可能被clone出來(lái)。
Clone要注意深拷貝和淺拷貝的問(wèn)題。Object類(lèi)的clone方法只會(huì)拷貝對(duì)象中8種基本數(shù)據(jù)類(lèi)型和它們的封裝類(lèi),對(duì)于其它類(lèi)型(對(duì)于數(shù)組、容器對(duì)象、引用對(duì)象)的對(duì)象,只會(huì)拷貝其引用,是為淺拷貝。例如Person類(lèi)里有一個(gè)Phone類(lèi)的屬性,現(xiàn)在有個(gè)Person對(duì)象A,拷貝出對(duì)象B,B中的Phone和A中的Phone是同一個(gè),修改了其中一個(gè),就會(huì)影響另一個(gè)。如果要實(shí)現(xiàn)深拷貝,就需要在clone方法里自己實(shí)現(xiàn)深拷貝。
@Override
public Person clone(){
Person person = null;
try {
person = (Person)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
// 深拷貝
person.phone = (Phone)phone.clone();
return person;
}
4. 原型模式總結(jié)
Clone的方式創(chuàng)建對(duì)象,比通過(guò)new創(chuàng)建對(duì)象的效率要高;因此原型模式適合創(chuàng)建對(duì)象成本較高的場(chǎng)景。
原型模式需要為類(lèi)編寫(xiě)clone方法,尤其是在深拷貝的場(chǎng)景,需要層層實(shí)現(xiàn)深拷貝。
(完)