《設(shè)計(jì)模式》第8章:原型模式_第1頁
《設(shè)計(jì)模式》第8章:原型模式_第2頁
《設(shè)計(jì)模式》第8章:原型模式_第3頁
《設(shè)計(jì)模式》第8章:原型模式_第4頁
《設(shè)計(jì)模式》第8章:原型模式_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第8章原型模式本章教學(xué)內(nèi)容原型模式模式動(dòng)機(jī)與定義模式結(jié)構(gòu)與分析模式實(shí)例與解析模式效果與應(yīng)用模式擴(kuò)展原型模式模式動(dòng)機(jī)原型模式模式動(dòng)機(jī)在面向?qū)ο笙到y(tǒng)中,使用原型模式來復(fù)制一個(gè)對(duì)象自身,從而克隆出多個(gè)與原型對(duì)象一模一樣的對(duì)象。在軟件系統(tǒng)中,有些對(duì)象的創(chuàng)建過程較為復(fù)雜,而且有時(shí)候需要頻繁創(chuàng)建,原型模式通過給出一個(gè)原型對(duì)象來指明所要?jiǎng)?chuàng)建的對(duì)象的類型,然后用復(fù)制這個(gè)原型對(duì)象的辦法創(chuàng)建出更多同類型的對(duì)象,這就是原型模式的意圖所在。原型模式模式定義原型模式(PrototypePattern):原型模式是一種對(duì)象創(chuàng)建型模式,用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過復(fù)制這些原型創(chuàng)建新的對(duì)象。原型模式允許一個(gè)對(duì)象再創(chuàng)建另外一個(gè)可定制的對(duì)象,無須知道任何創(chuàng)建的細(xì)節(jié)。原型模式的基本工作原理是通過將一個(gè)原型對(duì)象傳給那個(gè)要發(fā)動(dòng)創(chuàng)建的對(duì)象,這個(gè)要發(fā)動(dòng)創(chuàng)建的對(duì)象通過請(qǐng)求原型對(duì)象拷貝原型自己來實(shí)現(xiàn)創(chuàng)建過程。原型模式模式定義PrototypePattern:Specifythekindofobjectstocreateusingaprototypicalinstance,andcreatenewobjectsbycopyingthisprototype.Frequencyofuse:medium

原型模式模式結(jié)構(gòu)原型模式模式結(jié)構(gòu)原型模式包含如下角色:Prototype:抽象原型類ConcretePrototype:具體原型類Client:客戶類原型模式模式分析在原型模式結(jié)構(gòu)中定義了一個(gè)抽象原型類,所有的Java類都繼承自java.lang.Object,而Object類提供一個(gè)clone()方法,可以將一個(gè)Java對(duì)象復(fù)制一份。因此在Java中可以直接使用Object提供的clone()方法來實(shí)現(xiàn)對(duì)象的克隆,Java語言中的原型模式實(shí)現(xiàn)很簡(jiǎn)單。能夠?qū)崿F(xiàn)克隆的Java類必須實(shí)現(xiàn)一個(gè)標(biāo)識(shí)接口Cloneable,表示這個(gè)Java類支持復(fù)制。如果一個(gè)類沒有實(shí)現(xiàn)這個(gè)接口但是調(diào)用了clone()方法,Java編譯器將拋出一個(gè)CloneNotSupportedException異常。原型模式模式分析示例代碼:publicclassPrototypeDemo

implementsCloneable{

……

publicObjectclone()

{

Objectobject=null;

try{

object=super.clone();

}catch(CloneNotSupportedExceptionexception){

System.err.println("Notsupportcloneable");

}

returnobject;}……}原型模式模式分析通常情況下,一個(gè)類包含一些成員對(duì)象,在使用原型模式克隆對(duì)象時(shí),根據(jù)其成員對(duì)象是否也克隆,原型模式可以分為兩種形式:深克隆和淺克隆。原型模式模式分析淺克隆與深克隆深克隆淺克隆原型模式模式分析Java語言提供的clone()方法將對(duì)象復(fù)制了一份并返回給調(diào)用者。一般而言,clone()方法滿足:(1)對(duì)任何的對(duì)象x,都有x.clone()!=x,即克隆對(duì)象與原對(duì)象不是同一個(gè)對(duì)象。(2)對(duì)任何的對(duì)象x,都有x.clone().getClass()==x.getClass(),即克隆對(duì)象與原對(duì)象的類型一樣。(3)如果對(duì)象x的equals()方法定義恰當(dāng),那么x.clone().equals(x)應(yīng)該成立。原型模式原型模式實(shí)例與解析實(shí)例一:郵件復(fù)制(淺克?。┯捎卩]件對(duì)象包含的內(nèi)容較多(如發(fā)送者、接收者、標(biāo)題、內(nèi)容、日期、附件等),某系統(tǒng)中現(xiàn)需要提供一個(gè)郵件復(fù)制功能,對(duì)于已經(jīng)創(chuàng)建好的郵件對(duì)象,可以通過復(fù)制的方式創(chuàng)建一個(gè)新的郵件對(duì)象,如果需要改變某部分內(nèi)容,無須修改原始的郵件對(duì)象,只需要修改復(fù)制后得到的郵件對(duì)象即可。使用原型模式設(shè)計(jì)該系統(tǒng)。在本實(shí)例中使用淺克隆實(shí)現(xiàn)郵件復(fù)制,即復(fù)制郵件(Email)的同時(shí)不復(fù)制附件(Attachment)。原型模式原型模式實(shí)例與解析實(shí)例一:郵件復(fù)制(淺克?。┰湍J皆湍J綄?shí)例與解析實(shí)例一:郵件復(fù)制(淺克?。﹨⒖即a(Chapter08Prototype\sample01)演示……原型模式原型模式實(shí)例與解析實(shí)例二:郵件復(fù)制(深克?。┦褂蒙羁寺?shí)現(xiàn)郵件復(fù)制,即復(fù)制郵件的同時(shí)復(fù)制附件。原型模式原型模式實(shí)例與解析實(shí)例二:郵件復(fù)制(深克?。┰湍J皆湍J綄?shí)例與解析實(shí)例二:郵件復(fù)制(深克?。﹨⒖即a(Chapter08Prototype\sample02)演示……原型模式模式優(yōu)缺點(diǎn)原型模式的優(yōu)點(diǎn)當(dāng)創(chuàng)建新的對(duì)象實(shí)例較為復(fù)雜時(shí),使用原型模式可以簡(jiǎn)化對(duì)象的創(chuàng)建過程,通過一個(gè)已有實(shí)例可以提高新實(shí)例的創(chuàng)建效率。可以動(dòng)態(tài)增加或減少產(chǎn)品類。原型模式提供了簡(jiǎn)化的創(chuàng)建結(jié)構(gòu)??梢允褂蒙羁寺〉姆绞奖4鎸?duì)象的狀態(tài)。原型模式模式優(yōu)缺點(diǎn)原型模式的缺點(diǎn)需要為每一個(gè)類配備一個(gè)克隆方法,而且這個(gè)克隆方法需要對(duì)類的功能進(jìn)行通盤考慮,這對(duì)全新的類來說不是很難,但對(duì)已有的類進(jìn)行改造時(shí),不一定是件容易的事,必須修改其源代碼,違背了“開閉原則”。在實(shí)現(xiàn)深克隆時(shí)需要編寫較為復(fù)雜的代碼。原型模式模式適用環(huán)境在以下情況下可以使用原型模式:創(chuàng)建新對(duì)象成本較大,新的對(duì)象可以通過原型模式對(duì)已有對(duì)象進(jìn)行復(fù)制來獲得,如果是相似對(duì)象,則可以對(duì)其屬性稍作修改。如果系統(tǒng)要保存對(duì)象的狀態(tài),而對(duì)象的狀態(tài)變化很小,或者對(duì)象本身占內(nèi)存不大的時(shí)候,也可以使用原型模式配合備忘錄模式來應(yīng)用。相反,如果對(duì)象的狀態(tài)變化很大,或者對(duì)象占用的內(nèi)存很大,那么采用狀態(tài)模式會(huì)比原型模式更好。需要避免使用分層次的工廠類來創(chuàng)建分層次的對(duì)象,并且類的實(shí)例對(duì)象只有一個(gè)或很少的幾個(gè)組合狀態(tài),通過復(fù)制原型對(duì)象得到新實(shí)例可能比使用構(gòu)造函數(shù)創(chuàng)建一個(gè)新實(shí)例更加方便。原型模式模式應(yīng)用(1)原型模式應(yīng)用于很多軟件中,如果每次創(chuàng)建一個(gè)對(duì)象要花大量時(shí)間,原型模式是最好的解決方案。很多軟件提供的復(fù)制(Ctrl+C)和粘貼(Ctrl+V)操作就是原型模式的應(yīng)用,復(fù)制得到的對(duì)象與原型對(duì)象是兩個(gè)類型相同但內(nèi)存地址不同的對(duì)象,通過原型模式可以大大提高對(duì)象的創(chuàng)建效率。

原型模式模式應(yīng)用(2)在Struts2中為了保證線程的安全性,Action對(duì)象的創(chuàng)建使用了原型模式,訪問一個(gè)已經(jīng)存在的Action對(duì)象時(shí)將通過克隆的方式創(chuàng)建出一個(gè)新的對(duì)象,從而保證其中定義的變量無須進(jìn)行加鎖實(shí)現(xiàn)同步,每一個(gè)Action中都有自己的成員變量,避免Struts1因使用單例模式而導(dǎo)致的并發(fā)和同步問題。(3)在Spring中,用戶也可以采用原型模式來創(chuàng)建新的bean實(shí)例,從而實(shí)現(xiàn)每次獲取的是通過克隆生成的新實(shí)例,對(duì)其進(jìn)行修改時(shí)對(duì)原有實(shí)例對(duì)象不造成任何影響。原型模式模式擴(kuò)展帶原型管理器的原型模式原型模式模式擴(kuò)展帶原型管理器的原型模式參考代碼(Chapter08Prototype\原型管理器)演示……原型模式模式擴(kuò)展相似對(duì)象的復(fù)制很多情況下,復(fù)制所得到的對(duì)象與原型對(duì)象并不是完全相同的,它們的某些屬性值存在異同。通過原型模式獲得相同對(duì)象后可以再對(duì)其屬性進(jìn)行修改,從而獲取所需對(duì)象。如多個(gè)學(xué)生對(duì)象的信息的區(qū)別在于性別、姓名和年齡,而專業(yè)、學(xué)院、學(xué)校等信息都相同,為了簡(jiǎn)化創(chuàng)建過程,可以通過原型模式來實(shí)現(xiàn)相似對(duì)象的復(fù)制。原型模式模式擴(kuò)展相似對(duì)象的復(fù)制參考代碼(Chapter08Prototype\相似對(duì)象的復(fù)制)演示……本章小結(jié)原型模式是一種對(duì)象創(chuàng)建型模式,用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過復(fù)制這些原型創(chuàng)建新的對(duì)象。原型模式允許一個(gè)對(duì)象再創(chuàng)建另外一個(gè)可定制的對(duì)象,無須知道任何創(chuàng)建的細(xì)節(jié)。原型模式的基本工作原理是通過將一個(gè)原型對(duì)象傳給那個(gè)要發(fā)動(dòng)創(chuàng)建的對(duì)象,這個(gè)要發(fā)動(dòng)創(chuàng)建的對(duì)象通過請(qǐng)求原型對(duì)象拷貝原型自己來實(shí)現(xiàn)創(chuàng)建過程。原型模式包含三個(gè)角色:抽象原型類是定義具有克隆自己的方法的接口;具體原型類實(shí)現(xiàn)具體的克隆方法,在克隆方法中返回自己的一個(gè)克隆對(duì)象;讓一個(gè)原型克隆自身從而創(chuàng)建一個(gè)新的對(duì)象,在客戶類中只需要直接實(shí)例化或通過工廠方法等方式創(chuàng)建一個(gè)對(duì)象,再通過調(diào)用該對(duì)象的克隆方法復(fù)制得到多個(gè)相同的對(duì)象。在Java中可以直接使用Object提供的clone()方法來實(shí)現(xiàn)對(duì)象的克隆,能夠?qū)崿F(xiàn)克隆的Java類必須實(shí)現(xiàn)一個(gè)標(biāo)識(shí)接口Cloneable,表示這個(gè)Java類支持復(fù)制。本章小結(jié)在淺克隆中,當(dāng)對(duì)象被復(fù)制時(shí)它所包含的成員對(duì)象卻沒有被復(fù)制;在深克隆中,除了對(duì)象本身被復(fù)制外,對(duì)象包含的引用也被復(fù)制,也就是其中的成員對(duì)象也將復(fù)制。在Java語言中,通過覆蓋Object類的clone()方法可以實(shí)現(xiàn)淺克??;如果需要實(shí)現(xiàn)深克隆,可以通過序列化等方式來實(shí)現(xiàn)。原型模式最大的優(yōu)點(diǎn)在于可以快速創(chuàng)建很多相同或相似的對(duì)象,簡(jiǎn)化對(duì)象的創(chuàng)建過程,還可以保存對(duì)象的一些中間狀態(tài);其缺點(diǎn)在于需要為每一個(gè)類配備

溫馨提示

  • 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)論