深度解析Java設(shè)計(jì)模式中的原型模式澳窑!詳細(xì)說(shuō)明原型模式的兩種實(shí)現(xiàn)方式

Prototype-原型模式

  • 原型模式: 通過原型的實(shí)例來(lái)指定創(chuàng)建對(duì)象的類型,然后通過拷貝來(lái)創(chuàng)建更多同類型的對(duì)象
  • 原型模式的特點(diǎn):
    • 原型模式屬于創(chuàng)建型模式
    • 原型模式要求原型類實(shí)現(xiàn)拷貝自身的接口,這樣就可以通過拷貝原型的實(shí)例來(lái)創(chuàng)建新的對(duì)象
    • 原型模式拷貝原型實(shí)例創(chuàng)建的新對(duì)象不需要關(guān)心對(duì)象本身的類型,只需要實(shí)現(xiàn)原型實(shí)例拷貝自身的方法,就可以通過自定義的拷貝方法來(lái)創(chuàng)建新的對(duì)象,不需要通過new創(chuàng)建新的對(duì)象

原型模式的實(shí)現(xiàn)方式

  • 原型模式主要用于對(duì)象的復(fù)制,核心就是抽象原型Prototype
  • 抽象原型Prototype需要具備兩個(gè)條件:
    • 實(shí)現(xiàn)Clonable接口:
      • Clonable接口的作用是在運(yùn)行時(shí)通知JVM可以安全地在實(shí)現(xiàn)Clonable接口的類上使用clone方法
      • JVM中,只有實(shí)現(xiàn)了Clonable接口的類才可以拷貝,否則會(huì)拋出CloneNotSupportedException異常
    • 重寫Object類中的clone方法:
      • 所有類的父類都是Object,Object類中有clone() 方法用于返回一個(gè)拷貝的對(duì)象,但是方法的作用域是protected, 一般類無(wú)法進(jìn)行調(diào)用
      • 抽象原型Prototypeclone() 方法的作用域修改為public類型
  • 原型模式的適用場(chǎng)景:
    • 在需要重復(fù)創(chuàng)建相似的對(duì)象時(shí)可以使用原型模式,即只是個(gè)別的幾個(gè)屬性不同時(shí)
    • 直接創(chuàng)建對(duì)象的成本損耗大.比如初始化時(shí)間長(zhǎng),CPU占用大,網(wǎng)絡(luò)資源占用過多,需要優(yōu)化資源等
    • 直接創(chuàng)建一個(gè)對(duì)象后還需要準(zhǔn)備大量的數(shù)據(jù)以及訪問權(quán)限時(shí),需要提高性能或者安全性
    • 系統(tǒng)中大量使用該類對(duì)象,且各個(gè)調(diào)用者都需要給對(duì)象的屬性重新賦值
  • 原型模式有兩種實(shí)現(xiàn)方式:
    • 簡(jiǎn)單實(shí)現(xiàn)方式
    • 登記實(shí)現(xiàn)方式

簡(jiǎn)單實(shí)現(xiàn)方式

在這里插入圖片描述
  • 原型模式的簡(jiǎn)單實(shí)現(xiàn)方式包含三個(gè)角色:
    • 抽象原型Prototype: 抽象原型類.給出所有的具體原型所需要實(shí)現(xiàn)的拷貝方法的接口或者抽象類
    • 具體原型ConcretePrototype: 用于拷貝的原型實(shí)例.實(shí)現(xiàn)了抽象原型Prototype所要求的接口
    • 客戶Client: 客戶端Client用來(lái)請(qǐng)求創(chuàng)建新的對(duì)象

原型管理器實(shí)現(xiàn)方式

在這里插入圖片描述
  • 原型模式可以擴(kuò)展成為帶有原型管理器的原型模式:
    • 在原型模式的基礎(chǔ)上增加了新的原型管理器PrototypeManager
    • 原型管理器PrototypeManager類中使用HashMap保存多個(gè)復(fù)制的原型對(duì)象
    • 客戶端Client類可以通過原型管理器中的get(String id) 方法獲取復(fù)制的原型對(duì)象

原型模式注意點(diǎn)

  • 原型模式不會(huì)調(diào)用類的構(gòu)造方法:
    • 原型模式通過Object類的clone() 方法拷貝對(duì)象,是直接在內(nèi)存中拷貝原型實(shí)例的數(shù)據(jù),所以不會(huì)調(diào)用類的構(gòu)造方法
    • 類的構(gòu)造方法不會(huì)執(zhí)行并且訪問權(quán)限對(duì)原型模式無(wú)效.因?yàn)閱卫J街械膶㈩惖臉?gòu)造方法設(shè)置為private類型,但是clone() 方法是無(wú)視構(gòu)造方法的權(quán)限的.因此原型模式是與單例模式相互沖突的,所以要特別注意原型模式不可以和單例模式一起使用
  • 深拷貝與淺拷貝問題:
    • 原型模式通過Object類的clone() 方法拷貝對(duì)象時(shí)只會(huì)拷貝對(duì)象的基本數(shù)據(jù)類型以及對(duì)應(yīng)的封裝類型和值類型的String類型,不會(huì)拷貝數(shù)組,容器對(duì)象,引用對(duì)象等.這就是淺拷貝
    • 如果要實(shí)現(xiàn)深拷貝,需要將原型模式中的數(shù)組,容器對(duì)象和引用對(duì)象另行拷貝

原型模式總結(jié)

  • 原型模式本省比較簡(jiǎn)單,易于實(shí)現(xiàn).主要是重寫Object中的clone() 方法,根據(jù)要求實(shí)現(xiàn)淺拷貝或者是深拷貝
  • 原型模式的重點(diǎn)在淺拷貝和深拷貝的理解和運(yùn)用

原型模式優(yōu)點(diǎn)

  • 使用原型模式創(chuàng)建對(duì)象比直接使用new創(chuàng)建對(duì)象的性能要好: 因?yàn)?strong>Object中的clone() 方法是一個(gè)本地native方法,直接操作內(nèi)存中的二進(jìn)制流.尤其在拷貝大對(duì)象時(shí),性能提升明顯
  • 使用原型模式簡(jiǎn)化了對(duì)象的創(chuàng)建: 通過使用原型模式可以讓對(duì)象的創(chuàng)建像復(fù)制粘貼一樣簡(jiǎn)單
  • 可以使用深拷貝的方式保存對(duì)象的狀態(tài): 通過使用原型模式拷貝對(duì)象,并將狀態(tài)保存起來(lái),可以簡(jiǎn)化對(duì)象的創(chuàng)建過程,以便在需要時(shí)使用,可以輔助實(shí)現(xiàn)撤銷的操作

原型模式缺點(diǎn)

  • 原型模式需要為每一個(gè)類配置一個(gè)clone() 方法
  • clone() 方法在每個(gè)類的內(nèi)部,當(dāng)對(duì)已有類進(jìn)行重構(gòu)時(shí),需要修改代碼,違背了開閉原則
  • 實(shí)現(xiàn)深拷貝較為復(fù)雜,而且當(dāng)對(duì)象之間存在多重嵌套時(shí),為了實(shí)現(xiàn)深拷貝,需要每一層對(duì)象對(duì)應(yīng)的類都必須支持深拷貝,實(shí)現(xiàn)比較復(fù)雜
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末廓握,一起剝皮案震驚了整個(gè)濱河市伴鳖,隨后出現(xiàn)的幾起案子锯梁,更是在濱河造成了極大的恐慌,老刑警劉巖焰情,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件陌凳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡内舟,警方通過查閱死者的電腦和手機(jī)合敦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)验游,“玉大人蛤肌,你說(shuō)我怎么就攤上這事∨” “怎么了裸准?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)赔硫。 經(jīng)常有香客問我炒俱,道長(zhǎng),這世上最難降的妖魔是什么爪膊? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任权悟,我火速辦了婚禮,結(jié)果婚禮上推盛,老公的妹妹穿的比我還像新娘峦阁。我一直安慰自己,他們只是感情好耘成,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布榔昔。 她就那樣靜靜地躺著,像睡著了一般瘪菌。 火紅的嫁衣襯著肌膚如雪撒会。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天师妙,我揣著相機(jī)與錄音诵肛,去河邊找鬼。 笑死默穴,一個(gè)胖子當(dāng)著我的面吹牛怔檩,可吹牛的內(nèi)容都是我干的褪秀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼薛训,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼溜歪!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起许蓖,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蝴猪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后膊爪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體自阱,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年米酬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了沛豌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赃额,死狀恐怖加派,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情跳芳,我是刑警寧澤芍锦,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站飞盆,受9級(jí)特大地震影響娄琉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吓歇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一孽水、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧城看,春花似錦女气、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至鹃愤,卻和暖如春簇搅,著一層夾襖步出監(jiān)牢的瞬間完域,已是汗流浹背软吐。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吟税,地道東北人凹耙。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓姿现,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親肖抱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子备典,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容