每日Android源碼設(shè)計(jì)模式之-三县习、原型模式

原型模式非常好理解涮母,就是我們從原來(lái)的對(duì)象中復(fù)制出來(lái)一個(gè)一模一樣的對(duì)象,俗稱“克隆”躁愿,多用于創(chuàng)建復(fù)雜或者構(gòu)造耗時(shí)的實(shí)例叛本。


使用場(chǎng)景

1.類初始化需要消化非常多的資源,數(shù)據(jù)攘已、硬件資源等炮赦。

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

3.一個(gè)對(duì)象需要提供給其他對(duì)象使用样勃,各個(gè)調(diào)用者可能需要修改其值,但是又要保證其屬性獨(dú)立不相互影響性芬,也就是“保護(hù)性拷貝”峡眶。

比如A有一份文件要給B使用修改,但是A又不希望B更改自己的文件植锉,所以就克隆一份供B使用辫樱。

注意:有時(shí)候通過(guò)實(shí)現(xiàn)Cloneable接口調(diào)用clone方法復(fù)制對(duì)象的時(shí)候并不比new快,所以要考慮創(chuàng)建成本俊庇。


具體實(shí)現(xiàn)

一個(gè)類去實(shí)現(xiàn)Cloneable接口

復(fù)寫clone方法(這是Object類中的方法)

方法中:

XXXDoucument doc = (XXXDoucument)super.clone():

doc.mText = this.mText;

//....各種屬性賦值狮暑。

return doc;

淺拷貝和深拷貝

淺拷貝對(duì)于引用類型只是拷貝了字段引用辉饱。

深拷貝對(duì)于引用型的字段也要使用clone的方式來(lái)拷貝搬男。


Android源碼中的原型模式:

intent類就可以調(diào)用.clone()方法

intent類中的clone方法里面就寫了一句: return new Intent(this);

intent(Intent o)是一個(gè)拷貝構(gòu)造函數(shù),里面有大量諸如this.mAction = o.mAction的句子對(duì)屬性進(jìn)行設(shè)置彭沼。


實(shí)際應(yīng)用:

比如我們有一個(gè)記錄用戶信息的UserSession類缔逛,里面有一個(gè)包級(jí)私有方法setUserInfo(UserInfo info)方法,這個(gè)方法只有在同包級(jí)的登錄網(wǎng)絡(luò)類從網(wǎng)絡(luò)獲得用戶信息了才能調(diào)用姓惑,這個(gè)是沒(méi)問(wèn)題的褐奴。

可是保存用戶信息的UserInfo實(shí)體類中的變量確是public的,會(huì)被人為修改于毙。

為了只在網(wǎng)絡(luò)訪問(wèn)獲取用戶信息后才去修改用戶信息敦冬,避免在其他地方造成變化,我們讓User繼承Cloneable接口唯沮,復(fù)寫clone方法

public User clone(){

? ?User user = null;

? ?try{

? ? ?user = (User)super.clone();

? ?}catch(CloneNotSupportedException e){

? }

? return user;

}

然后再UserSession中g(shù)etLoginedUser里返回克隆類

return userInfo.clone();


這樣在其他地方即使修改了userInfo對(duì)象匪补,也不會(huì)影響從網(wǎng)絡(luò)獲取的最初的userInfo對(duì)象了伞辛。


優(yōu)點(diǎn):是在內(nèi)存中直接進(jìn)行二進(jìn)制流拷貝,例如在一個(gè)循環(huán)體中大量的new對(duì)象時(shí)夯缺,使用clone性能會(huì)好很多蚤氏。

缺點(diǎn):因?yàn)槭侵苯涌寺?duì)象,所以不會(huì)執(zhí)行構(gòu)造函數(shù)踊兜。要注意這一點(diǎn)竿滨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市捏境,隨后出現(xiàn)的幾起案子于游,更是在濱河造成了極大的恐慌,老刑警劉巖垫言,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贰剥,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡筷频,警方通過(guò)查閱死者的電腦和手機(jī)蚌成,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)凛捏,“玉大人担忧,你說(shuō)我怎么就攤上這事∨餮ⅲ” “怎么了瓶盛?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)示罗。 經(jīng)常有香客問(wèn)我惩猫,道長(zhǎng),這世上最難降的妖魔是什么蚜点? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任轧房,我火速辦了婚禮,結(jié)果婚禮上禽额,老公的妹妹穿的比我還像新娘锯厢。我一直安慰自己,他們只是感情好脯倒,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布实辑。 她就那樣靜靜地躺著,像睡著了一般藻丢。 火紅的嫁衣襯著肌膚如雪剪撬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天悠反,我揣著相機(jī)與錄音残黑,去河邊找鬼馍佑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛梨水,可吹牛的內(nèi)容都是我干的拭荤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼疫诽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼舅世!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起奇徒,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤雏亚,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后摩钙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體罢低,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年胖笛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了网持。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡匀钧,死狀恐怖翎碑,靈堂內(nèi)的尸體忽然破棺而出谬返,到底是詐尸還是另有隱情之斯,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布遣铝,位于F島的核電站佑刷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏酿炸。R本人自食惡果不足惜瘫絮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望填硕。 院中可真熱鬧麦萤,春花似錦、人聲如沸扁眯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)姻檀。三九已至命满,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绣版,已是汗流浹背胶台。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工歼疮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人诈唬。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓韩脏,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親铸磅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子骤素,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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