這個模式我感覺對于我們大家來說真是的在熟悉不過了,不就是復制啊,在寫代碼的時候我有的時候就會ctrl+c,ctrl+v,復制的時候挺爽,出錯的時候別哭就行,嘻嘻
(如有異同請指出)
定義:用原型實例制定創建對象的種類,并且通過拷貝這些原型創建新的對象 解釋:我們通過原型模式可以快速的創建一個對象而不需要提供專門的new()操作就可以快速完成對象的創建,這無疑是一種非常有效的方式,快速的創建一個新的對象,原型模式其實就是從一個對象再創建另外一個可定制的對象,而且不需要知道任何創建的細節。 當我們學習工廠模式和簡單工廠等一些模式的時候,我們需要在開頭的時候就需要new一個對象而原型設計模式突破了這種繁瑣,它不用一點一點的從頭開始進行(初始化新對象),直接利用結果就好(動態的獲得對象運行時的狀態)
例如圖: 說簡單點其實原型設計模式就是copy出來一個原來對象,就像孫悟空拔下一嘬猴毛,輕輕一吹就會變出好多的孫悟空來。
Object類的clone方法只會拷貝對象中的基本的數據類型,對于數組、容器對象、引用對象等都不會拷貝,這就是淺拷貝。 淺復制其實就是傳引用,當copy的時候我們copy的是地址中的內容,當地址中的內容改變,我們隨之也改變
實現深拷貝:必須將原型模式中的數組、容器對象、引用對象等另行拷貝 深復制其實就是傳引用,當copy的時候我們copy的是值,也就是說當地址中的值改變的時候不會影響到我們原來的值。 在代碼中體現淺復制與深復制的區別,通過接口我們可以看出區別 如圖
深復制代理類
//簡歷類 class Resume : ICloneable { //定義姓名,性別,年齡,工作經歷里面的work,引用工作經歷對象 PRivate string name; private string sex; private string age; private WorkExperience work; //只對工作經歷進行copy,在簡歷類實例化時間時實例化"工作經歷" public Resume(string name) { this.name = name; work = new WorkExperience(); } //提供Clone方法調用的私有構造函數,以便克隆工作經歷的數據 private Resume(WorkExperience work) { this.work = (WorkExperience)work.Clone(); } . . . . //調用私有的構造方法,讓工作經歷克隆完成,然后 public object Clone() { Resume obj = new Resume(this.work ); obj.name = this.name; obj.sex = this.sex; obj.age = this.age; return obj ; } } //工作經歷類實現ICloneable class WorkExperience:ICloneable { //定義工作時間字段 private string workDate; //屬性 public string WorkDate { get { return workDate; } set { workDate = value; } } //定義公司 private string company; //屬性 public string Company { get { return company; } set { company = value; } } //工作盡力類實現克隆方法 public object Clone() { return (object)this.MemberwiseClone(); } }淺復制代碼
//簡歷類 class Resume:ICloneable { //定義姓名,性別,年齡,工作經歷里面的work,引用工作經歷對象 private string name; private string sex; private string age; private WorkExperience work; //只對工作經歷進行copy,在簡歷類實例化時間時實例化"工作經歷" public Resume(string name) { this.name = name; work = new WorkExperience(); } . . . public object Clone() { return (object)this.MemberwiseClone(); } } //工作經歷類 class WorkExperience { //定義工作時間字段 private string workDate; . . . .....新聞熱點
疑難解答