原型模式:用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。
即:就是從乙個物件再建立另外乙個可定製的物件,而且不需知道任何建立的細節。就是轉殖乙個新的物件,在客戶端,看不到簡歷類的內容。但是可以修改細節。
例項:寫簡歷。我們簡單設定個人資訊和工作經歷不同的兩個新情況。
簡歷類:
class resume:icloneable
//設定個人資訊
public void setpersonalinfo(string ***,string age)
//設定工作經歷
public void setworkexperience(string timearea,string company)
//顯示
public void display()
",name,***,age);
console.writeline("工作經歷: ",timearea,company);
}public object clone()
}
客戶端:
static void main(string args)
結果:
分析:只需要呼叫clone方法就可以實現新簡歷的生成,並且可以再修改新簡歷的細節。 一般在初始化的資訊不發生變化的情況下,轉殖是最好的辦法。這既隱藏了物件建立的細節,又對效能是大大的提高。轉殖不用重新初始化物件,而是動態地獲得物件執行時的狀態。
淺複製與深複製:
我認為淺複製就相當於對乙個東西的操作。深複製就是複製乙個新東西,對它進行操作。舉例:淺複製就是對於乙個種子,栽種澆水。深複製是轉殖出新的種子,對它進行栽種澆水各種操作,原來的種子不受影響。
簡歷淺複製的實現:
**:工作經歷類:
//工作經歷
class workexperience
set
}private string company;
public string company
set }}
簡歷:
//簡歷
class resume : icloneable
//設定個人資訊
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()
}
客戶端呼叫**:
分析:對於值型別name,***,age,當客戶端對其進行修改時,會發生改變。但是對於引用型別,如work.date,work.company只是複製了引用,並不是複製了實體,所以一直是對於原始物件進行修改。於是三次展示的都是最後修改的結果。
簡歷深複製的實現:
工作經歷類中,增加了轉殖這個方法。
public object clone()
簡歷類中提供clone方法呼叫的私有建構函式,以便轉殖「工作經歷」的資料。
private resume(workexperience work)
簡歷類呼叫私有的構造方法,讓「工作經歷」轉殖完成,然後再給這個「簡歷」物件的相關字段賦值,最終返回乙個深複製的簡歷物件。
public object clone()
結果,三次的顯示結構各不同:
分析:
這樣是分別轉殖出幾個實體,進行修改,所以三種呈現的不同的結果。
設計模式 原型模式
1.首先分析原型模式的由來 一般來說,建立乙個物件可以由以下方法 知道物件的具體型別,直接用new生成。不知道型號,知道相應的需求,可以使用工廠方法模式。根據乙個已有的物件來複製為乙個新的物件,可以使用原型模式。2.原型模式可以簡單理解為拷貝原型物件得到新的物件。想象乙個配鑰匙的小店,給店主乙個原有...
設計模式 原型模式
魔術師手拿一張百元大鈔,瞬間又變出兩張。也像配鑰匙一樣,拿一把鑰匙,老師傅就能做出另乙個一模一樣的。像這種複製我們並不陌生,類似於我們設計中的原型模式 本文將從以下幾點 原型模式 概述 結構圖 淺複製深複製 總結 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。允許乙個物件再建立另外...
設計模式 原型模式
原型模式 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。1 假設我們現有乙個物件,但是它的型別需要執行期確定,我們不知道它的動態型別是什麼,現在我們想建立它的副本。顯然通過建構函式建立是很麻煩的,這時候我們可以使用原型模式中的clone函式直接得到該物件的副本。2 有些時候我們想要...