老板說:“給我蓋一座大樓。”
工程師說:“蓋什么樣的大樓呢?”
老板指著身后的一座樓說:“和那個一模一樣的。”
從老板的角度來講,他采用的就是,Prototype模式,即原型模式。否則,他需要再花費一些時間和工程師一點一點的探討關于大樓的一些設計問題。
所謂的原型模式,就是用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象。
JAVA的Object.clone()的存在,使得這個模型的學習變得簡單了許多。
一.搭橋過河
過河是一門大學問
首先研究一下JAVA的clone技術。
我理解的很簡單,無非是把一個對象進行復制粘貼。那么,來看一下JAVA語言中是如何來實現的這個步驟的。我們依次需要知道以下這些事。
1.Object對象中有一個clone()方法。而且是protected。
2.繼承于Object的類一般都可以實現這個方法(有特殊的,比如StringBuffer等,官方定的,不去研究它)。
3.想被clone的對象需要實現接口Cloneable。如果此對象的類不能實現接口Cloneable,則會拋出CloneNotSupportedExcetion。
4.所有的數組都被視為實現接口Cloneable。
5.clone分為淺clone(又稱影子clone)和深clone。
6.Object類本身不實現接口Cloneable,所以在類為Object的對象上調用clone方法,將會導致在運行時拋出異常。
首先來看一個能夠實現clone類的小例子。
//本文代碼參考于http://blog.csdn.net/tiewen/archive/2005/08/05/446301.aspx

class CloneClass implements Cloneable
{
public int aInt;


public Object clone()
{
CloneClass o = null;

try
{
o = (CloneClass) super.clone();

} catch (CloneNotSupportedException e)
{
e.printStackTrace();
}
return o;
}
}
至于淺clone和深clone,無非就是一個程度問題。再來看一個例子。

class UnCloneA
{
private int i;


public UnCloneA(int ii)
{
i = ii;
}


public void doublevalue()
{
i *= 2;
}


public String toString()
{
return Integer.toString(i);
}
}


class CloneB implements Cloneable
{
public int aInt;

public UnCloneA unCA = new UnCloneA(111);


public Object clone()
{
CloneB o = null;

try
{
o = (CloneB) super.clone();

} catch (CloneNotSupportedException e)
{
e.printStackTrace();
}
return o;
}
}


class CloneMain
{

public static void main(String[] a)
{
CloneB b1 = new CloneB();
b1.aInt = 11;
System.out.println("before clone,b1.aInt = " + b1.aInt);
System.out.println("before clone,b1.unCA = " + b1.unCA);
CloneB b2 = (CloneB) b1.clone();
b2.aInt = 22;
b2.unCA.doublevalue();
System.out.println("=================================");
System.out.println("after clone,b1.aInt = " + b1.aInt);
System.out.println("after clone,b1.unCA = " + b1.unCA);
System.out.println("=================================");
System.out.println("after clone,b2.aInt = " + b2.aInt);
System.out.println("after clone,b2.unCA = " + b2.unCA);
}
}

輸出結果為:
/** RUN RESULT:
before clone,b1.aInt = 11
before clone,b1.unCA = 111
=================================
after clone,b1.aInt = 11
after clone,b1.unCA = 222
=================================
after clone,b2.aInt = 22
after clone,b2.unCA = 222
*/
可見,當執行clone這個動作的時候,系統首先開辟一個和它一樣的空間。然后分別對其內容進行復制。復制過程中,如果是基本類型,沒什么說的,直接把值復制過來。如果不是基本類型,復制的則是該類型對象的引用。
這樣的clone就是所謂的淺clone。那很顯然,如果上面復制的過程中,對于非基本類型實現的不是一個引用復制,而是創建一個新的一樣的對象(其實也是一個clone步驟),那么就是所謂的深clone。對于深度克隆只不過是clone的一種擴展,還有N深clone等等。對于這些,和我們要研究的原型模式沒有多少關系。不想去研究。
關于JAVA的clone技術,對我來說,理解這些就夠了。其它的,就是進一步的擴展及應用。
二.以長克短
什么時候會想到用原型模式呢
這個我們學習任何一項技術都要問自己的問題。
要用它,就要知道它的優點。合理的利用它的優點來為我們服務。做人也一樣,不要總拿自己的短處去比別人的長處。要知道,每個人都是不一樣的,每個人都有自己的長處和短處。這就是以長克短。
JAVA中的clone方法,其實現是native的。這也就意味著它的執行效率是遠高于new一個新對象的。所以,
當需要生成大量相似對象的時候,可以考慮下應用clone,也就是原形模式。
我的項目經驗幾乎為0,單純從理解的角度去想的。
至于其它的應用,還有待前輩們指點。我再不斷補充。
歡迎來訪!^.^!
本BLOG僅用于個人學習交流!
目的在于記錄個人成長.
所有文字均屬于個人理解.
如有錯誤,望多多指教!不勝感激!