原型模式是一種對象創(chuàng)建型模式,它的工作原理很簡單:將一個原型對象傳給要發(fā)動創(chuàng)建的對象(客戶端對象)隘弊,這個要發(fā)動創(chuàng)建的對象通過請求原型對象復(fù)制自己來實現(xiàn)創(chuàng)建過程(也稱為克隆對象)哈踱。通過克隆方法所創(chuàng)建的對象是全新的對象,它們在內(nèi)存中擁有新的地址长捧,通常對克隆所產(chǎn)生的對象進(jìn)行修改不會對原型對象造成任何影響嚣鄙,每一個克隆對象都是相互獨立的。
在復(fù)制原型對象的同時是否復(fù)制包含在原型對象中引用類型的成員變量串结,原型模式的克隆機制分為兩種哑子,即淺克隆和深克隆舅列。
1.淺克隆:在淺克隆中卧蜓,當(dāng)原型對象被復(fù)制時只復(fù)制它本身和其中包含的值類型的成員變量帐要,而引用類型的成員變量并沒有復(fù)制,只是復(fù)制了引用對象的地址弥奸。
2.深克抡セ荨:除了對象本身被復(fù)制外,對象所包含的所有成員變量也將被復(fù)制盛霎。
原型模式的結(jié)構(gòu)與實現(xiàn):
1.Prototype(抽象原型類):它是聲明克隆方法的接口赠橙,是所有具體原型類的公共父類,它可以是抽象類也可以是接口或者具體類愤炸。
public abstract class Prototype {期揪,
public abstract Prototype clone();
}
2.ConcretePrototype(具體原型類):它實現(xiàn)在抽象原型類中聲明的克隆方法,在克隆方法中返回自己的一個克隆對象规个。
public class ConcretePrototype extends Prototype {
private String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
@Override
public Prototype clone() {
ConcretePrototype prototype=new ConcretePrototype();
prototype.setStr(this.str);
return prototype;
}
}
3.Client(客戶類):在客戶類中凤薛,讓一個原型對象克隆自身從而創(chuàng)建一個新的對象,由于客戶類針對抽象原型類Prototype編程诞仓,因此用戶可以根據(jù)需要選擇具體原型類缤苫。
public class Client {
public static void main(String[] args) {
ConcretePrototype prototype=new ConcretePrototype();
prototype.setStr("Str");
ConcretePrototype copyPrototype=(ConcretePrototype) prototype.clone();
System.out.println(prototype==copyPrototype);
}
}
Java中的clone()方法和Cloneable接口:在java中所有類的父類Object類提供了一個clone()方法,可以將一個對象復(fù)制一份墅拭,但只是實現(xiàn)了對象的淺克隆活玲。
public class ConcretePrototypeB implements Cloneable {
public Prototype clone() {
Object object = null;
try {
object = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return (Prototype) object;
}
}