




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android中如何實(shí)現(xiàn)原型模式
這篇文章將為大家詳細(xì)講解有關(guān)Android中如何實(shí)現(xiàn)原型模式,文章內(nèi)容質(zhì)量較高,因此在下分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。一、介紹原型模式是一個(gè)創(chuàng)建型的模式。原型二字表明了該模型應(yīng)該有一個(gè)樣板實(shí)例,用戶從這個(gè)樣板對(duì)象中復(fù)制出一個(gè)內(nèi)部屬性一致的對(duì)象,這個(gè)過(guò)程也就是我們俗稱的“克隆”。被復(fù)制的實(shí)例就是我們所稱的“原型”,這個(gè)原型也是可定制的。原型模型多用于創(chuàng)建復(fù)雜的或者構(gòu)造耗時(shí)的實(shí)例,因?yàn)檫@種情況下,復(fù)制一個(gè)已經(jīng)存在的實(shí)例可使程序運(yùn)行更高效。二、定義用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并通過(guò)拷貝這些原型創(chuàng)建新的對(duì)象。三、使用場(chǎng)景(1)類初始化需要消耗非常多的資源,這個(gè)資源包括數(shù)據(jù)、硬件資源等,通過(guò)原型拷貝避免這些消耗。(2)通過(guò)new產(chǎn)生一個(gè)對(duì)象需要非常繁瑣的數(shù)據(jù)準(zhǔn)備或訪問(wèn)權(quán)限,這時(shí)可以使用原型模式。(3)一個(gè)對(duì)象需要提供給其他對(duì)象訪問(wèn),而且各個(gè)調(diào)用者可能都需要修改其值時(shí),可以考慮使用原型模式拷貝多個(gè)對(duì)象供調(diào)用者使用,即保護(hù)性拷貝。需要注意的是,通過(guò)實(shí)行Cloneable接口的原型模式在調(diào)用clone函數(shù)構(gòu)造實(shí)例時(shí)并不一定比通過(guò)new操作速度快,只有當(dāng)通過(guò)new構(gòu)造對(duì)象較為耗時(shí)或者說(shuō)成本較高時(shí),通過(guò)clone方法才能夠獲得效率上的提升。因此,在使用Cloneable時(shí)需要考慮構(gòu)建對(duì)象的成本以及做一些效率上的測(cè)試。當(dāng)然,實(shí)現(xiàn)原型模式也不一定非要實(shí)現(xiàn)Cloneable接口,也有其他的實(shí)現(xiàn)方式,這里將會(huì)對(duì)這些一一說(shuō)明。四、原型模型的UML類圖圖中角色介紹:Client:客戶端用戶。Prototype:抽象類或者接口,聲明具備clone能力。ConcretePrototype:具體的原型類。五、原型模式的簡(jiǎn)單實(shí)現(xiàn)下面以簡(jiǎn)單的文檔拷貝為例來(lái)演示一下簡(jiǎn)單的原型模式,我們?cè)谶@個(gè)例子中首先創(chuàng)建了一個(gè)文檔對(duì)象,即WordDocument,這個(gè)文檔中含有文字和圖片。用戶經(jīng)過(guò)了長(zhǎng)時(shí)間的內(nèi)容編輯后,打算對(duì)該文檔做進(jìn)一步的編輯,但是,這個(gè)編輯后的文檔是否會(huì)被采用還不確定,因此,為了安全起見,用戶需要將當(dāng)前文檔拷貝一份,然后再在文檔副本上進(jìn)行修改,這與《EffectiveJava》一書中提到的保護(hù)性拷貝有些類似,如此,這個(gè)原始文檔就是我們上述所說(shuō)的樣板實(shí)例,也就是將要被“克隆”的對(duì)象,我們成為原型:示例代碼:/**
*
文檔類型,扮演的是ConcretePrototype角色,而cloneable是代表prototype角色
*/
public
class
WordDocument
implements
Cloneable
{
//文本
private
String
mText;
//圖片名列表
private
ArrayList<String>
mImages
=
new
ArrayList<String>();
public
WordDocument(){
System.out.println("
WordDocument構(gòu)造函數(shù)
");
}
public
String
getText(){
return
this.mText;
}
public
void
setText(String
text){
this.mText
=
text;
}
public
ArrayList<String>
getImages(){
return
this.mImages;
}
public
void
setImages(ArrayList<String>
images){
this.mImages
=
images;
}
public
void
addImage(String
img){
this.mImages.add(img);
}
/**
*
打印文檔
*/
public
void
showDocument(){
System.out.println("
Word
Content
Start
");
System.out.println("Text
:
"
+
this.mText);
System.out.println("Images
List
:
");
for(String
image
:
mImages){
System.out.println("image
name
:
"
+
image);
}
System.out.println("
Word
Content
End
");
}
@Override
protected
WordDocument
clone(){
try{
WordDocument
doc
=
(WordDocument)super.clone();
doc.mText
=
this.mText;
doc.mImages
=
this.mImages;
return
doc;
}catch(Exception
e){}
return
null;
}
}執(zhí)行方法:public
static
void
main(String[]
args)
throws
IOException
{
//1.構(gòu)建文檔對(duì)象
WordDocument
originDoc
=
new
WordDocument();
//2.編輯文檔,添加圖片等
originDoc.setText("這是一篇文檔");
originDoc.addImage("圖片一");
originDoc.addImage("圖片二");
originDoc.addImage("圖片三");
originDoc.showDocument();
//以原始文檔為原型,拷貝一份副本
WordDocument
doc2
=
originDoc.clone();
doc2.showDocument();
//修改文檔副本
doc2.setText("這是修改過(guò)的Doc2文本");
doc2.addImage("這是新添加的圖片");
originDoc.showDocument();
doc2.showDocument();
}執(zhí)行結(jié)果:
WordDocument構(gòu)造函數(shù)
//originDoc
Word
Content
Start
Text
:
這是一篇文檔
Images
List
:
image
name
:
圖片一
image
name
:
圖片二
image
name
:
圖片三
Word
Content
End
//doc2
Word
Content
Start
Text
:
這是一篇文檔
Images
List
:
image
name
:
圖片一
image
name
:
圖片二
image
name
:
圖片三
Word
Content
End
//副本修改后originDoc
Word
Content
Start
Text
:
這是一篇文檔
Images
List
:
image
name
:
圖片一
image
name
:
圖片二
image
name
:
圖片三
image
name
:
這是新添加的圖片
Word
Content
End
//副本修改后doc2
Word
Content
Start
Text
:
這是修改過(guò)的Doc2文本
Images
List
:
image
name
:
圖片一
image
name
:
圖片二
image
name
:
圖片三
image
name
:
這是新添加的圖片
Word
Content
End
這里我們發(fā)現(xiàn)通過(guò)修改doc2后,只是影響了originDoc的mImages,而沒(méi)有改變mText。六、淺拷貝和深拷貝上述原型模式的實(shí)現(xiàn)實(shí)際上只是一個(gè)淺拷貝,也稱影子拷貝,這份拷貝實(shí)際上并不是將原始的文檔的所有字段都重新構(gòu)造了一份,而是副本文檔的字段引用原始文檔的字段,如下圖:細(xì)心的讀者可能從上面的結(jié)果中發(fā)現(xiàn),最后兩個(gè)文檔信息輸出是一致的。我們?cè)赿oc2添加了一張圖片,但是,同時(shí)也顯示在originDoc中,這是怎么回事呢?學(xué)習(xí)過(guò)C++的讀者都會(huì)有比較深刻的體會(huì),這是因?yàn)樯衔闹蠾ordDocument的clone方法中只是簡(jiǎn)單的進(jìn)行了淺拷貝,引用類型的新對(duì)象doc2.mImages只是單純的指向了this.mImages引用,并沒(méi)有重新構(gòu)造一個(gè)mImages對(duì)象,然后將原始文檔中的圖片添加到新的mImages對(duì)象中,這樣就導(dǎo)致doc2.mImages與原始文檔中的是同一個(gè)對(duì)象,因此,修改了其中一個(gè)文檔中的圖片,另一個(gè)文檔也會(huì)受影響。那么如何解決這個(gè)問(wèn)題呢?答案就是采用深拷貝,即在拷貝對(duì)象時(shí),對(duì)于引用型的字段也要采用拷貝的形式,而不是單純引用的形式。clone方法修改如下(其他不變):@Override
protected
WordDocument
clone(){
try{
WordDocument
doc
=
(WordDocument)super.clone();
doc.mText
=
this.mText;
//對(duì)mImages對(duì)象也調(diào)用clone()函數(shù),進(jìn)行深拷貝
doc.mImages
=
(ArrayList<String>)this.mImages.clone();
return
doc;
}catch(Exception
e){}
return
null;
}修改后在執(zhí)行上述代碼的結(jié)果是:
WordDocument構(gòu)造函數(shù)
//originDoc
Word
Content
Start
Text
:
這是一篇文檔
Images
List
:
image
name
:
圖片一
image
name
:
圖片二
image
name
:
圖片三
Word
Content
End
//doc2
Word
Content
Start
Text
:
這是一篇文檔
Images
List
:
image
name
:
圖片一
image
name
:
圖片二
image
name
:
圖片三
Word
Content
End
//副本修改后originDoc
Word
Content
Start
Text
:
這是一篇文檔
Images
List
:
image
name
:
圖片一
image
name
:
圖片二
image
name
:
圖片三
Word
Content
End
//副本修改后doc2
Word
Content
Start
Text
:
這是修改過(guò)的Doc2文本
Images
List
:
image
name
:
圖片一
image
name
:
圖片二
image
name
:
圖片三
image
name
:
這是新添加的圖片
Word
Content
End
可以看出現(xiàn)在互不影響,這個(gè)叫做深拷貝。接著上面的疑問(wèn),其實(shí)String類型在淺拷貝時(shí)和引用類型一樣,沒(méi)有單獨(dú)復(fù)制,而是引用同一地址,因?yàn)镾tring沒(méi)有實(shí)現(xiàn)cloneable接口,也就是說(shuō)只能復(fù)制引用。(這里我們可以查看源碼可以看到,而ArrayList實(shí)現(xiàn)了cloneable接口)但是當(dāng)修改其中的一個(gè)值的時(shí)候,會(huì)新分配一塊內(nèi)存用來(lái)保存新的值,這個(gè)引用指向新的內(nèi)存空間,原來(lái)的String因?yàn)檫€存在指向他的引用,所以不會(huì)被回收,這樣,雖然是復(fù)制的引用,但是修改值的時(shí)候,并沒(méi)有改變被復(fù)制對(duì)象的值。所以在很多情況下,我們可以把String在clone的時(shí)候和基本類型做相同的處理,只是在equals時(shí)注意一些就行了。原型模式是非常簡(jiǎn)單的一個(gè)模式,它的核心問(wèn)題就是對(duì)原始對(duì)象進(jìn)行拷貝,在這個(gè)模式的使用過(guò)程中需要注意的一點(diǎn)就是:深、淺拷貝的問(wèn)題。在開發(fā)過(guò)程中,為了減少錯(cuò)誤,作者建議使用該模式時(shí)盡量使用深拷貝,避免操作副本時(shí)影響原始對(duì)象的問(wèn)題。七、Android源碼中的原型模式示例代碼:Uri
uri
=
Uri.parse("smsto:110");
Intent
intent
=
new
Intent(Intent.ACTION_SEND,uri);
intent.putExtra("sms_body",
"The
SMS
text");
//克隆
Intent
intent2
=
(Intent)intent.clone();
startActivity(intent2);八、總結(jié)原型模式本質(zhì)上就是對(duì)象的拷貝,與C++中的拷貝構(gòu)造函數(shù)有些類似,它們之間容易出現(xiàn)的問(wèn)題也都是深拷貝、淺拷貝。使用原型模式可以解決構(gòu)建復(fù)雜對(duì)象的資源消耗問(wèn)題,能夠在某些場(chǎng)景下提升創(chuàng)建對(duì)象的效率。優(yōu)點(diǎn):(1)原型模式是在內(nèi)存中二進(jìn)制流的拷貝,要比直接new一個(gè)對(duì)象性能好很多,特別是要在一個(gè)循環(huán)體內(nèi)產(chǎn)生大量對(duì)象時(shí),原型模式可能更好的體現(xiàn)其優(yōu)點(diǎn)。(2)還有一個(gè)重要的用途就是保護(hù)性拷貝,也就是對(duì)某個(gè)對(duì)象對(duì)外可能是只讀的,為了防止外部對(duì)這個(gè)只讀對(duì)象的修改,通???/p>
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 保安人員勞動(dòng)合同保安人員合同
- 辦公家具定點(diǎn)采購(gòu)合同
- 洗車機(jī)施工方案
- 小區(qū)商鋪裝飾裝修協(xié)議書
- 九龍坡屋頂漏水施工方案
- 《陶淵明集》序 賞析
- 南充硅pu籃球場(chǎng)施工方案
- 建筑工程廉潔監(jiān)理合同協(xié)議-@-1
- 泄流箱涵施工方案
- 遼河吹填施工方案
- 2025年安徽電氣工程職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫(kù)學(xué)生專用
- 2025年皖西衛(wèi)生職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)審定版
- unctad -全球投資趨勢(shì)監(jiān)測(cè) 第 48 期 Global Investment Trends Monitor,No. 48
- 2025年福建省高職單招計(jì)算機(jī)類職業(yè)技能測(cè)試題及答案(供參考)
- 電鍍園區(qū)現(xiàn)場(chǎng)管理
- 學(xué)校在鑄牢中華民族共同體意識(shí)教育工作情況報(bào)告
- 2025年安徽淮北市建投控股集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 《孤獨(dú)的小螃蟹》導(dǎo)讀課件
- 城市軌道交通行車組織 課件 項(xiàng)目3 車站行車作業(yè)組織
- GA/T 2145-2024法庭科學(xué)涉火案件物證檢驗(yàn)實(shí)驗(yàn)室建設(shè)技術(shù)規(guī)范
- 2024智能網(wǎng)聯(lián)汽車零部件行業(yè)研究報(bào)告-2025-01-智能網(wǎng)聯(lián)
評(píng)論
0/150
提交評(píng)論