原型模式——《Android源碼設(shè)計(jì)模式解析與實(shí)踐》讀書(shū)筆記4

定義

用原型實(shí)例指定創(chuàng)建對(duì)象的種類(lèi)值纱,并通過(guò)拷貝這些原型創(chuàng)建新的對(duì)象


使用場(chǎng)景

(1)類(lèi)初始化需要消耗非常多的資源京景,包括數(shù)據(jù)星掰、硬件資源等。通過(guò)原型拷貝可以避免這些操作盼铁。

(2)通過(guò)new產(chǎn)生一個(gè)對(duì)象需要非常繁瑣的數(shù)據(jù)準(zhǔn)備或者訪問(wèn)權(quán)限粗蔚。

(3)一個(gè)對(duì)象需要提供給其他對(duì)象訪問(wèn),而且各個(gè)調(diào)用者可能都需要修改其值時(shí)饶火,可以考慮使用原型模式拷貝多個(gè)對(duì)象供調(diào)用者試用鹏控,即保護(hù)性拷貝


UML類(lèi)圖


原型模式,多角色

關(guān)鍵點(diǎn)

(1)淺拷貝(影子拷貝):副本的屬性字段引用原型的屬性字段肤寝,即副本和原型相同的屬性字段指向內(nèi)存里同一個(gè)對(duì)象当辐。特別地,對(duì)于引用型的屬性鲤看,如ArrayList缘揪、String等,在兩個(gè)對(duì)象的任意一個(gè)里進(jìn)行修改【注意:修改并非賦值】义桂,另一個(gè)都會(huì)發(fā)生相應(yīng)變化找筝。

(2)深拷貝:副本的引用型屬性字段通過(guò)拷貝原型中對(duì)應(yīng)字段生成,而非直接引用慷吊。

(3)保護(hù)性拷貝:若希望某個(gè)對(duì)象對(duì)外只讀袖裕,防止外部對(duì)其修改,但實(shí)際調(diào)用過(guò)程中可能必須修改溉瓶,在希望不影響原數(shù)據(jù)的情況下急鳄,可以采用原型模式,以原對(duì)象為原型堰酿,對(duì)外提供其拷貝以供使用疾宏,無(wú)論怎么修改都不會(huì)影響到原對(duì)象,此做法稱(chēng)為保護(hù)性拷貝触创。

(4)原型模式產(chǎn)生新副本的過(guò)程中并沒(méi)有調(diào)用原型的構(gòu)造函數(shù)坎藐,所以如果構(gòu)造函數(shù)中有必須做的重要操作時(shí),請(qǐng)?jiān)赾lone()方法中完成哼绑,或勿使用原型模式


實(shí)現(xiàn)方式

淺拷貝:

public class ConcreatePrototype implements Cloneable{

? ? private Object a = null;

? ? private ConcreatePrototype(){}

? ? public void setA(Object a){

? ? ? ? this.a= a;

? ? }

? ? public Object getA(){

? ? ? ? return a;

? ? }

? ? @Override

? ? protected ConcreatePrototype clone(){

? ? ? ? try{

? ? ? ? ? ? Concreate Prototypetemp = (ConcreatePrototype) super.clone();

? ? ? ? ? ? temp.setA(this.a)

? ? ? ? ? ? return temp;

? ? ? ? }catch (Exception e){

? ? ? ? }

? ? ? ? return null;

? ? }

}

深拷貝:

public class ConcreatePrototype implements Cloneable{

? ? private Object a = null;

? ? private ArrayListlist = new ArrayList();

? ? private ConcreatePrototype(){}

? ? public void setA(Object a){

? ? ? ? this.a= a;

? ? }

? ? public Object getA(){

? ? ? ? return a;

? ? }

? ? public void setList(ArrayList list){

? ? ? ? this.list= list;

? ? }

? ? public ArrayListgetList(){

? ? ? ? returnlist;

? ? }

? ? public void addString(String string){

? ? ? ? list.add(string);

? ? }

? ? @Override

? ? protected ConcreatePrototype clone(){

? ? ? ? try{

? ? ? ? ? ? ConcreatePrototype temp = (ConcreatePrototype) super.clone();

? ? ? ? ? ? temp.a= a;

? ? ? ? ? ? temp.list= (ArrayList)list.clone();

? ? ? ? ? ? return temp;

? ? ? ? }catch (Exception e){

? ? ? ? }

? ? ? ? return null;

? ? }

}

調(diào)用:

pubic void class Test{

? ? public static void main(String [] args){

? ? ? ? ConcreatePrototype prototype = new ConcreatePrototype();

? ? ? ? prototype.setA("prototype");

? ? ? ? ConcreatePrototype newCopy = prototype.clone();

? ? ? ? newCopy.setA("copy");

? ? }

}


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

優(yōu)點(diǎn)

原型模式是在內(nèi)存中二進(jìn)制流的拷貝顺饮,性能上要比調(diào)用構(gòu)造函數(shù)重新生成一個(gè)要好很多。特別是要再一個(gè)循環(huán)體內(nèi)產(chǎn)生大量對(duì)象的時(shí)候凌那,原型模式可以更好地體現(xiàn)其優(yōu)點(diǎn)。

缺點(diǎn)

由于構(gòu)造函數(shù)不執(zhí)行吟逝,所以對(duì)象的很多內(nèi)部約束并不會(huì)實(shí)現(xiàn)帽蝶,當(dāng)缺少這部分約束可能導(dǎo)致程序出錯(cuò)時(shí),在拷貝方法里就需要做完備的添加工作。


Android中的單例類(lèi)舉例

類(lèi)名:Intent(多數(shù)不用原型模式生成)


——2017.08.01

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末励稳,一起剝皮案震驚了整個(gè)濱河市佃乘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌驹尼,老刑警劉巖趣避,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異新翎,居然都是意外死亡程帕,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)地啰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)愁拭,“玉大人,你說(shuō)我怎么就攤上這事亏吝×氩海” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵蔚鸥,是天一觀的道長(zhǎng)惜论。 經(jīng)常有香客問(wèn)我,道長(zhǎng)止喷,這世上最難降的妖魔是什么馆类? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮启盛,結(jié)果婚禮上蹦掐,老公的妹妹穿的比我還像新娘。我一直安慰自己僵闯,他們只是感情好卧抗,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著鳖粟,像睡著了一般社裆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上向图,一...
    開(kāi)封第一講書(shū)人閱讀 52,682評(píng)論 1 312
  • 那天泳秀,我揣著相機(jī)與錄音,去河邊找鬼榄攀。 笑死嗜傅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的檩赢。 我是一名探鬼主播吕嘀,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了偶房?” 一聲冷哼從身側(cè)響起趁曼,我...
    開(kāi)封第一講書(shū)人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎棕洋,沒(méi)想到半個(gè)月后挡闰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掰盘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年摄悯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庆杜。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡射众,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晃财,到底是詐尸還是另有隱情叨橱,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布断盛,位于F島的核電站罗洗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏钢猛。R本人自食惡果不足惜伙菜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望命迈。 院中可真熱鬧贩绕,春花似錦、人聲如沸壶愤。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)征椒。三九已至娇哆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間勃救,已是汗流浹背碍讨。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蒙秒,地道東北人勃黍。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像晕讲,于是被迫代替她去往敵國(guó)和親覆获。 傳聞我的和親對(duì)象是個(gè)殘疾皇子榜田,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)锻梳,斷路器,智...
    卡卡羅2017閱讀 134,715評(píng)論 18 139
  • 1大同小異的工作周報(bào) Sunny軟件公司一直使用自行開(kāi)發(fā)的一套OA (Office Automatic净捅,辦公自動(dòng)化...
    justCode_閱讀 1,163評(píng)論 0 3
  • 1 場(chǎng)景問(wèn)題# 1.1 訂單處理系統(tǒng)## 考慮這樣一個(gè)實(shí)際應(yīng)用:訂單處理系統(tǒng)疑枯。 現(xiàn)在有一個(gè)訂單處理的系統(tǒng),里面有個(gè)...
    七寸知架構(gòu)閱讀 4,450評(píng)論 3 63
  • 面向?qū)ο蟮牧笤瓌t 單一職責(zé)原則 所謂職責(zé)是指類(lèi)變化的原因蛔六。如果一個(gè)類(lèi)有多于一個(gè)的動(dòng)機(jī)被改變荆永,那么這個(gè)類(lèi)就具有多于...
    JxMY閱讀 948評(píng)論 1 3
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法国章,內(nèi)部類(lèi)的語(yǔ)法具钥,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法液兽,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,665評(píng)論 18 399