什么是原型模式
站在用戶的角度思考問題,與客戶深入溝通,找到龍沙網(wǎng)站設(shè)計(jì)與龍沙網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、國(guó)際域名空間、網(wǎng)頁(yè)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋龍沙地區(qū)。
所謂原型模式,就是用原型實(shí)例來指定創(chuàng)建對(duì)象的種類,并通過復(fù)制這些原型創(chuàng)建新的對(duì)象的設(shè)計(jì)模式。原型模式一般用于創(chuàng)建復(fù)雜的或者構(gòu)建耗時(shí)的實(shí)例,或者用于只讀對(duì)象的修改。
原型模式的實(shí)現(xiàn)方式
(1)淺拷貝
當(dāng)代的每個(gè)程序員小時(shí)候都玩過《尤里的復(fù)仇》這款游戲,游戲中的“尤里”陣營(yíng)有個(gè)兵種叫“尤里復(fù)制人”,每個(gè)尤里復(fù)制人都和尤里長(zhǎng)得一模一樣,除了沒有坐騎之外。
public classYuri{ |
如上,重寫了clone()方法。在執(zhí)行如下代碼時(shí):
Yuri yuri =newYuri(); yuri.addWord("I'm not the only one true Yuri");
|
會(huì)驚奇地發(fā)現(xiàn)兩行Log一模一樣,這是因?yàn)檫@種原型模式的實(shí)現(xiàn)方式只拷貝其引用,換句話說就是并沒有將原型對(duì)象中的所有字段都重新構(gòu)造一份,只是用復(fù)制對(duì)象的字段引用原型對(duì)象中的字段,因此被稱為“淺拷貝”或“影子拷貝”。
(2)深拷貝
我們把上文的clone()方法修改一下:
@Override |
如上,這種實(shí)現(xiàn)方式調(diào)用了的clone()方法,這樣可以保證副本被修改時(shí)不影響原始對(duì)象,因此被稱為“深拷貝”,又叫做“保護(hù)性拷貝”。
Android源碼中的原型模式
(1)ArrayList
嚴(yán)格來說ArrayList并不算是Android源碼中的類,但應(yīng)該是Android開發(fā)者最常用的類,ArrayList的clone()代碼如下:
/** |
大家可以看到size并沒有被clone,因?yàn)閟ize是基礎(chǔ)類型而不是引用類型,所以不需要clone。細(xì)心的讀者可以看到注釋里面的“shallow copy”,但這實(shí)際上是一個(gè)典型的深拷貝。
(3)Intent
Android系統(tǒng)加入Intent機(jī)制的意義在于大大降低了Android四大組件之間的耦合度。Intent的clone()代碼如下:
@Override
/** |
Intent的clone()內(nèi)部并沒有調(diào)用super.clone(),而是調(diào)用了new Intent(this)。
Android開發(fā)中如何利用原型模式
(1)Object的clone()方法直接操作二進(jìn)制流,效率非常高。在對(duì)象的初始化要消耗非常多的資源時(shí),或者用new來實(shí)例化一個(gè)對(duì)象時(shí)需要非常繁瑣的數(shù)據(jù)準(zhǔn)備或訪問權(quán)限時(shí),可以使用原型模式提高效率、避免消耗資源。
(2)對(duì)深拷貝生成的副本進(jìn)行修改不會(huì)影響原始對(duì)象。當(dāng)一個(gè)對(duì)象會(huì)被不同對(duì)象用不同方式修改時(shí),可以用原型模式產(chǎn)生副本供調(diào)用者使用。
需要注意的幾個(gè)問題
(1)原型模式在clone()的時(shí)候不會(huì)重新執(zhí)行構(gòu)造函數(shù),可能會(huì)出現(xiàn)問題。
(2)在某些對(duì)象構(gòu)造非常簡(jiǎn)單的情況下,比如上文提到的Intent,重新new一個(gè)比clone()快,因此不要濫用原型模式
本系列其他博客
【設(shè)計(jì)模式與Android】工廠方法模式——化工女神的工廠
【設(shè)計(jì)模式與Android】抽象工廠模式——嵌合體克隆工廠
【設(shè)計(jì)模式與Android】策略模式——錦囊里的上策中策下策
【設(shè)計(jì)模式與Android】狀態(tài)模式——一個(gè)人的兩幅面孔
【設(shè)計(jì)模式與Android】責(zé)任鏈模式——曹瞞兵敗走華容