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