記得有一次寫程式,我需要做這樣一件事,我需要對我當前的物件的所有內容做個儲存,然後來操作它,並且還需要和原來的資料做對比。
這個物件大致如下:
public
class a
public
void
setname(string name)
public string getid()
public
void
setid(string id)
public arraylistgetimage()
public
void
setimage(arraylistimage)
}
這好像是一件很簡單的事,於是我就開始動手了,我先建立乙個新的物件b,然後,用已有的物件a的所有欄位來初始化b。
a b = new a();
b.setid(a.getid());
b.setname(a.getname());
b.setimage(a.getimage());
這樣做完後,又有乙個問題,這兩個物件a,b都指向同一張,意味著它兩永遠是相同的,我怎麼做對比。
好吧,我就卡這了。
經過我查資料,知道了,原來我完成的工作只是乙個淺拷貝,而我想要的是深拷貝的結果,並且,我的**寫的非常差。這兒有個建立型的設計模式,叫做原型模式,可以很好地完成這個工作。
首先,淺拷貝:
public
class
aimplements
cloneable
public
void
setname(string name)
public string getid()
public
void
setid(string id)
public arraylistgetimage()
public
void
setimage(arraylistimage)
@override
protected object clone() throws clonenotsupportedexception
}
這是淺拷貝,和上面的**差不多,但是,做到了封裝,我們需要複製時,只需要呼叫方法即可,但是,在對比時,還是永遠相同的。
我們來看看深拷貝:
public
class
aimplements
cloneable
public
void
setname(string name)
public string getid()
public
void
setid(string id)
public arraylistgetimage()
public
void
setimage(arraylistimage)
@override
protected object clone() throws clonenotsupportedexception
}
在這(arraylist) this.getimage().clone(),呼叫了這個方法,就可以實現深拷貝,這樣更加簡單。
注意:建立物件是a aa = (a) super.clone();而不是通過new關鍵字來實現的。
有這樣一句話,理解了就能正確的使用new 或supper.clone了:使用clone和new需要根據構造物件的成本來決定,如果物件的構造成本比較高或構造比較麻煩,那麼使用clone函式效率比較高,否則可以使用new的形式。
以上覆制乙個物件的過程就是原型模式,我們要複製的物件就是原型。
設計模式之原型模式
原型模式其實就是從乙個物件再建立乙個可定製的物件,而且不需要知道建立的細節。具體就是說通過複製或者轉殖乙個原型物件產生新的物件 轉殖物件 分為兩種 深複製或者淺複製,這兩種的主要區別是 在原型中如果有物件的引用,淺複製是將引用複製過來了,也就是淺複製和原型中的物件的引用相同,而深複製是將轉殖物件中引...
設計模式之原型模式
include include 此練習為原型模式方法的練習 原型模式揭示了在同一原型上可以通過複製使得 只需要例項化一次,再通過相應的類函式操作可以得到 同一原型下的不同的版本物件 此練習將考慮在實際開發中 比如 工作經歷也是作為乙個類被含在簡歷類中的情況 這情況將涉及到類的引用和深 淺複製 原型基...
設計模式之原型模式
原型模式的思想就是將乙個物件作為原型,對其進行複製 轉殖,產生乙個和原物件類似的新物件 複製過程可分為淺複製和深複製。淺複製是指直接呼叫父類 即object類 的clone方法 super.clone 該方法是本地 native 方法,呼叫該方法clone出來的新物件,基本資料型別的屬性變數是新建立...