用原型例項制定建立物件的種類,並且通過拷貝這些原型建立新的物件。從乙個物件再建立乙個可定製的物件,而且不需知道任何建立的細節。
如果欄位是值型別的,則對該字段執行逐位複製,如果欄位是引用型別的,則複製引用但不複製引用的物件。形成原始物件與其複本引用同一物件。簡單來說,值型別變數,無論是淺複製還是深複製,其值會因原始物件的更改而更改。引用型別變數,若是淺複製,其轉殖物件的值會隨原始物件的變化而變化。若是深複製,其轉殖物件的值不會隨原始物件的變化而變化。
有乙個類。例項化複製後想保留這個例項的乙個備份。
例如 :
//clone類中包含乙個int length欄位。
clone clonetest=new clone();
clone clonecopy=newclone();
clonetest..length=0;
clonecopy=clonetest;
到這個部分
clonetest
和clonecopy
中的length
值都變為
0了。 但如果接著加一行**
clonetest.length=1;
預期是希望
clonetest
中length=1
而clonecopy
中length=0
;但實際兩者都變為1了。
這裡出現這個原因就是因為類是個引用型別,所以當執行
clonecopy=clonetest;
時,是將位址給過去了。於是當然一者變。兩者都會變了。
c#中的引用型別採用這種方法都是給位址。複製引用位址就是淺度複製。而複製物件的值,建立新的物件就是深度複製。
class workexperience//工作經歷類
set
}private string company;//公司
public string company
set }}
class resume : icloneable//簡歷類
public void setpersonainfo(string ***,string age)
public void setworkexperience(string workdate,string company)//呼叫此方法時,給物件的兩屬性複製
public void display()
", name, ***, age);
console.writeline("工作經歷: ",work.workdate, work.company);
}public object clone()
}
客戶端**:
static void main(string args)
class workexperienct : icloneable//工作經歷實現icloneable介面
set
}private string company;
public string company
set
}//建立當前物件的淺表複製
//方法是建立乙個新的物件,將當前物件的字段資訊複製到該新物件
//如果該欄位型別為值型別,那麼對該字段執行逐位複製
//如果是引用型別,則複製引用但不複製引用物件
public object clone()//工作經歷類實現轉殖方法
}class resume : icloneable
private resume(workexperienct work)
//提供clone方法呼叫的私有建構函式,以便轉殖工作經歷的資料
public void setpersonalinfo(string ***,string age)
public void setworkexperience(string workdate,string company)
public void display()
", name, ***, age);
console.writeline("工作經歷: ",work.workdate, work.company);
}//呼叫私有的構造方法,讓工作經歷轉殖完成,
//然後再給這個簡歷物件的相關字段賦值,最終返回乙個深複製的簡歷物件
public object clone()
}
1.效能提高
2.逃避建構函式的約束
1.配備轉殖方法需要對類的功能進行通盤考慮,對於全新的類不是很難,當對於已有的類,應用不支援序列化的間接物件,或引用含有迴圈結構時,比較複雜
2.必須實現cloneable介面
1、資源優化場景。
2、類初始化需要消化非常多的資源,這個資源包括資料、硬體資源等。
3、通過 new 產生乙個物件需要非常繁瑣的資料準備或訪問許可權,則可以使用原型模式。
4、乙個物件多個修改者的場景。
乙個物件需要提供給其他物件訪問,而且各個呼叫者可能都需要修改其值時,可以考慮使用原型模式拷貝多個物件供呼叫者使用。
5、在實際專案中,原型模式很少單獨出現,一般是和工廠方法模式一起出現,通過 clone 的方法建立乙個物件,然後由工廠方法提供給呼叫者。
設計模式 原型模式
1.首先分析原型模式的由來 一般來說,建立乙個物件可以由以下方法 知道物件的具體型別,直接用new生成。不知道型號,知道相應的需求,可以使用工廠方法模式。根據乙個已有的物件來複製為乙個新的物件,可以使用原型模式。2.原型模式可以簡單理解為拷貝原型物件得到新的物件。想象乙個配鑰匙的小店,給店主乙個原有...
設計模式 原型模式
魔術師手拿一張百元大鈔,瞬間又變出兩張。也像配鑰匙一樣,拿一把鑰匙,老師傅就能做出另乙個一模一樣的。像這種複製我們並不陌生,類似於我們設計中的原型模式 本文將從以下幾點 原型模式 概述 結構圖 淺複製深複製 總結 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。允許乙個物件再建立另外...
設計模式 原型模式
原型模式 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。1 假設我們現有乙個物件,但是它的型別需要執行期確定,我們不知道它的動態型別是什麼,現在我們想建立它的副本。顯然通過建構函式建立是很麻煩的,這時候我們可以使用原型模式中的clone函式直接得到該物件的副本。2 有些時候我們想要...