面向?qū)ο笤O(shè)計(jì)模式縱橫談 學(xué)習(xí)筆記6 Prototype 原型(創(chuàng)建型模式)_第1頁
面向?qū)ο笤O(shè)計(jì)模式縱橫談 學(xué)習(xí)筆記6 Prototype 原型(創(chuàng)建型模式)_第2頁
面向?qū)ο笤O(shè)計(jì)模式縱橫談 學(xué)習(xí)筆記6 Prototype 原型(創(chuàng)建型模式)_第3頁
面向?qū)ο笤O(shè)計(jì)模式縱橫談 學(xué)習(xí)筆記6 Prototype 原型(創(chuàng)建型模式)_第4頁
面向?qū)ο笤O(shè)計(jì)模式縱橫談 學(xué)習(xí)筆記6 Prototype 原型(創(chuàng)建型模式)_第5頁
已閱讀5頁,還剩1頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、C#C#面向?qū)ο笤O(shè)計(jì)模式縱橫談面向?qū)ο笤O(shè)計(jì)模式縱橫談 學(xué)習(xí)筆記學(xué)習(xí)筆記 6 6 PrototypePrototype原型(創(chuàng)建型模式)原型(創(chuàng)建型模式)本文關(guān)鍵字:本文關(guān)鍵字:Prototype 模式的動(dòng)機(jī)在軟件系統(tǒng)中,經(jīng)常面臨著某些結(jié)構(gòu)復(fù)雜的對(duì)象的創(chuàng)建工作;由于需求的變化,這些對(duì)象經(jīng)常面臨著劇烈的變化,但是它們卻擁有比較穩(wěn)定一致的接口。如何應(yīng)對(duì)這種變化?如何向客戶程序(使用這些對(duì)象的程序)隔離出這些易變對(duì)象 ,從而使得依賴這些易變對(duì)象的客戶程序不隨著需求改變而改變?Prototype 模式的意圖使用原型實(shí)例指定創(chuàng)建對(duì)象的種類,然后通過拷貝這些原型來創(chuàng)建新的對(duì)象。下面看看代碼首先我們有三個(gè)穩(wěn)定

2、的抽象基類publicabstractclassNormalActor.publicabstractNormalActorClone();publicabstractclassFlyActor.publicabstractFlyActorClone();publicabstractclassWaterActor.publicabstractWaterActorClone();這三個(gè)抽象基類是比較穩(wěn)定的類現(xiàn)在每個(gè)抽象基類里都有兩個(gè)派生類,并且實(shí)現(xiàn)了抽象方法 Clone。publicclassNormalActorA:NormalActor.publicoverrideNormalActorClo

3、ne()1234512345.return(NormalActor)this.MemberwiseClone();publicclassNormalActorB:NormalActor.本文關(guān)鍵字:本文關(guān)鍵字:publicoverrideNormalActorClone().return(NormalActor)this.MemberwiseClone();publicclassFlyActorA:FlyActor.publicoverrideFlyActorClone().return(FlyActor)this.MemberwiseClone();publicclassFlyAcotrB:

4、FlyActor1234512345 .publicoverrideFlyActorClone().return(FlyActor)this.MemberwiseClone();return(WaterActor)this.MemberwiseClone();publicclassWaterActorB:WaterActor.publicoverrideWaterActorClone()1234512345.return(WaterActor)this.MemberwiseClone();那么這些派生類可以說不是很穩(wěn)定的,他們可以被擴(kuò)展。那么現(xiàn)在有一個(gè) GameSystem 類,這個(gè)類有一個(gè)方

5、法publicclassGameSystem.publicstaticvoidRun(NormalActornormalActor,FlyActorflyActor,WaterActorwaterActor).NormalActornormalActor1=normalActor.Clone();&n本文關(guān)鍵字:本文關(guān)鍵字:FlyActorflyActor2=flyActor.Clone();WaterActorwaterActor1=waterActor.Clone();WaterActorwaterActor2=waterActor.Clone();1234512345 注意在這個(gè)方法里的

6、參數(shù) normalActor 等對(duì)象可以置為字段,這個(gè)是不重要的。重要的是我們根據(jù)給定的三個(gè)類型的實(shí)例,通過 Clone 方法,來創(chuàng)建相應(yīng)的拷貝對(duì)象。那么當(dāng)我們調(diào)用 Run 方法的時(shí)候staticvoidMain(stringargs).GameSystem.Run(newNormalActorA(),newFlyActorA(),newWaterAcotrA();我們通過傳入的對(duì)象的類型,使 Run 方法里的創(chuàng)建的對(duì)象與傳入的對(duì)象一致。但是我們使用 MemberwiseClone 方法的時(shí)候要注意,這是一個(gè)淺拷貝對(duì)象的方法,對(duì)于一個(gè)字段都為值類型的類是適用的,但是,如果有引用類型,這樣會(huì)導(dǎo)致

7、同一塊內(nèi)存被兩個(gè)引用指向。我們可以在 Clone 方法里對(duì)此進(jìn)行處理,講對(duì)象字段新 new 出來,并且逐項(xiàng)賦值。也可以實(shí)現(xiàn)序列化接口,讓類序列化,那么拷貝的時(shí)候是新生成的對(duì)象。Prototype 模式的幾個(gè)要點(diǎn)Prototype 模式同樣用于隔離類對(duì)象的使用者和具體類型(易變類)之間的耦合關(guān)系,它同樣要求這些易變類擁有穩(wěn)定的接口。Prototype 模式對(duì)于如何創(chuàng)建易變類的實(shí)體對(duì)象采用原型克隆的方法來做,它使得我們可以非常靈活地動(dòng)態(tài)創(chuàng)建擁有某些穩(wěn)定接口的新對(duì)象-所需工作僅僅是注冊(cè)一個(gè)新類的對(duì)象(即原型),然后在任何需要的地方不斷地 Clone。Prototype 模式中的 Clone 方法可以利用.NET 中的 Object 類的MemberwiseClone()方法或者序列化來實(shí)現(xiàn)深拷貝。有關(guān)創(chuàng)建性模式的討論Singleton 模式解決的是實(shí)體對(duì)象個(gè)數(shù)的問題。除了 Singleton 之外,其他創(chuàng)建型模式解決的都是 new 所帶來的耦合關(guān)系。Factory Method, Abstract Factory, Builder 都需要一個(gè)額外的工廠類來負(fù)責(zé)實(shí)例化易變對(duì)象,而 Prototype 則是通過原型(一個(gè)特殊的工廠類)來克隆易變對(duì)象。如果遇到易變類,起初的設(shè)計(jì)通常從

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論