原型模式(Prototype Pattern)是創建型模式的一種,其特點在於通過“複製”一個已經存在的實例來返回新的實例,而不是新建實例。被複制的實例就是我們所稱的“原型”,這個原型是可定製的。原型模式多用於創建複雜的或者耗時的實例,因爲這種情況下,複製一個已經存在的實例使程序運行更高效;或者創建值相等,只是命名不一樣的同類數據。原型模式中複製模型對象是通過Clone()方法實現的, 複製有兩種:深複製和淺複製。具體的區別就不在詳細描述,我會單獨來講解這兩種方式的區別,
2.圖示
3.代碼示例
/** Prototype Class **/
public class Cookie implements Cloneable {
public Object clone()
{
try{
//In an actual implementation of this pattern you would now attach references to
//the expensive to produce parts from the copies that are held inside the prototype.
return this.getClass().newInstance();
}
catch(InstantiationException e)
{
e.printStackTrace();
return null;
}
}
}
/** Concrete Prototypes to clone **/
public class CoconutCookie extends Cookie { }
/** Client Class**/
public class CookieMachine
{
private Cookie cookie;//cookie必須是可複製的
public CookieMachine(Cookie cookie) {
this.cookie = cookie;
}
public Cookie makeCookie() {
return (Cookie)cookie.clone();
}
public Object clone() { }
public static void main(String args[]){
Cookie tempCookie = null;
Cookie prot = new CoconutCookie();
CookieMachine cm = new CookieMachine(prot); //設置原型
for(int i=0; i<100; i++)
tempCookie = cm.makeCookie();//通過複製原型返回多個cookie
}
}
4.應用場景
當要實例化的類是在運行時刻指定時,例如,通過動態裝載;
爲了避免創建一個與產品類層次平行的工廠類層次時;
當一個類的實例只能有幾個不同狀態組合中的一種時。建立相應數目的原型並克隆它們可能比每次用合適的狀態手工實例化該類更方便一些。