<大話設計模式>本教程說明及著作權聲明
l 該文檔參考和使用了網路上的免費開放的圖片和內容,並以免費開放的方式發布,希望為移動互連網和智能手機時代貢獻綿薄之力!可以隨意轉載,但不得使用該文檔謀利。
l 如果對該文檔有任何疑問或者建議,請進入官方部落格
http://www.cnblogs.com/guoshiandroid/留言或者直接與國士工作室聯絡(後附連絡方式),我們會謹慎參考您的建議並根據需要對本文檔進行修改,以造福更多開發人員!
l 《大話設計模式》的最新及完整內容會在國士工作室官方部落格定期更新,請訪問國士工作室部落格
http://www.cnblogs.com/guoshiandroid/擷取更多更新內容。
國士工作室是一支專註於Android平台企業級應用開發的技術團隊,致力於做中國最棒的Android應用程式開發機構,提供最棒的Android企業級應用開發培訓服務。
企業培訓和開發合作官方連絡方式:
電話:18610086859
Email:hiheartfirst@gmail.com
QQ:1740415547
國士工作室 有你更美好!
原型模式 肉麻情話
原型模式應用情境舉例:
GG和MM經常在QQ上聊天,但是GG打字的速度慢如蝸牛爬行,每次MM在瞬間完成恢複或者問候是,GG都會很緊張的去儘力快速打字,儘管如此,還是讓MM有些不高心,MM說回複資訊這麼慢,顯然是用心不專,不在乎她。哎,GG也是百口難辯啊,不過也確實是沒有辦法。
有一天,GG想自己的密友K傾訴了自己的苦衷。K頓生大笑。說道:“傻瓜,你怎麼不去網上收集一些肉麻的情話以及一些你們經常說話會涉及到主題,把這些東西拷貝下來儲存在自己的電腦或者隨身碟裡面,這樣一來如果下次在聊天就可以借用過來了!”,“K就是K,我怎麼沒有想到呢~妙極~妙極^_^”,“不過不要太高興,這些東西是要適當修改的,要不然你把名字都搞錯的話,就等著你的MM把你踹死吧O(∩_∩)O哈哈~”K補充道,“嗯,說的對,謝謝K哥解決了我的心腹之患啊”GG樂不可支的說道。
這是MM由在網上和GG聊天,GG專門複製那些實現準備好的肉麻情話經過稍加修改後發給MM,MM都快美死了…
原型模式解釋:
原型模式(Prototype Pattern)是一種對象建立型模式,它採取複製原型對象的方法來建立對象的執行個體。使用Prototype模式建立的執行個體,具有與原型一樣的初始化資料
英文定義為:Specify the kinds of objects
to create using a prototypical instance, and create new objects by copying this
prototype.
原型模式的UML圖:
原型模式涉及以下的角色:
用戶端(Client)角色: 用戶端提出建立對象的請求。
抽象原型(Prototype)角色:通常由一個Java介面或者Java抽象類別來實現。從而為具體原型設立好規範。
具體原型(Concrete Prototype)角色:被複製的具體對象,此具體角色實現了抽象原型角色所要求實現的方法。
原型模式的UML圖如下所示:
原型模式深入分析:
原型模式的工作原理是:通過將一個原型對象傳給那個要發動建立的對象,這個要發動建立的對象通過請求原型對象拷貝它們自己來實施建立。
Java在語言層級是直接支援原型模式的。我們知道,在java.lang.Object是一切類和介面的父類,而java.lang.Object正好提供了一個clone()方法來支援原型模式。當然,一個對象如果想具有被複製的能力,還必須聲明自己實現了Cloneable介面,如果沒有聲明,就會在對象被複製的時候拋出CloneNotSupportedException.
在java.lang.Object中提供了一個 protected
Object clone()方法來支援對象的複製,子類可以採用預設的方式進行所有欄位的複製,也可以在子類中覆蓋clone()方便,根據實際需要定製自己的複製行為。
複製淺複製和深複製之分,淺複製是對基礎資料型別 (Elementary Data Type)和String類型而言的,深複製是對其他參考型別而言的。對於深複製,每一個應用也需要聲明Cloneable介面。
原型模式使用情境分析及代碼實現:
在上面的使用情境中,因為GG打字太慢經常被女朋友怪罪,所以有了拷貝網上肉麻情話的和主要聊天話題內容的辦法。這樣,以後GG每次和MM聊天的時候只需要把原話拷貝出來,加以適當修改就行,省時省力,而且效果絕佳^_^,這就是設計模式的原型模式的使用的好處O(∩_∩)O~
UML模型圖如下所示:
建立一個肉麻情話類,類中有非常詳細的注釋,這裡就不在解釋了:
package com.diermeng.designPattern.Prototype.impl; import java.util.ArrayList; import java.util.List; /* * 肉麻情話類 */ public class SweetWord implements Cloneable{ //肉麻情話句子 private String content; //肉麻情話句子集合 private List<String> contents; /* * 擷取肉麻情話集合 */ public List<String> getContents() { return contents; } /* * 設定肉麻情話集合 */ public void setContents(List<String> contents) { this.contents = contents; } /* * 擷取肉麻情話 */ public String getContent() { return content; } /* * 設定肉麻情話 */ public void setContent(String content) { this.content = content; } /* * 肉麻情話覆蓋了Object類的clone()方法,因為這裡有List引用進行深度複製 * @see java.lang.Object#clone() */ public SweetWord clone() { try { //建立一個肉麻情話對象,同時複製基本的屬性 SweetWord sweetWord = (SweetWord)super.clone(); //建立一個肉麻情話集合 List<String> newContents = new ArrayList<String>(); //把原對象的肉麻情話集合中的肉麻情話集合通過forEach迴圈加入建立的newContents中 for(String friend : this.getContents()) { newContents.add(friend); } //把新的肉麻情話集合設定進新的對象 sweetWord.setContents(newContents); //返回新的的肉麻情話對象 return sweetWord; } catch (CloneNotSupportedException e) { e.printStackTrace(); return null; } } } |
最後我們建立測試用戶端:
package com.diermeng.designPattern.Prototype.client; import java.util.ArrayList; import java.util.List; import com.diermeng.designPattern.Prototype.impl.SweetWord; /* * 肉麻情話測試用戶端 */ public class PrototypeClient { public static void main(String[] args) { //建立一個肉麻情話對象並設定相應的屬性 SweetWord content1 = new SweetWord(); List<String> contents = new ArrayList<String>(); contents.add("寶貝兒,我愛你"); contents.add("你是我的唯一"); content1.setContents(contents); //複製content1 SweetWord content2 = content1.clone(); //分別輸入兩個對象的內容 System.out.println(content1.getContents()); System.out.println(content2.getContents()); //在原來的肉麻情話對象中加入新的內容並把新的內容設定進去 contents.add("你是我真命天女"); content1.setContents(contents); //分別輸出新的修改後的兩個肉麻情話對象 System.out.println(content1.getContents()); System.out.println(content2.getContents()); } } |
輸出的結果如下:
[寶貝兒,我愛你, 你是我的唯一] [寶貝兒,我愛你, 你是我的唯一] [寶貝兒,我愛你, 你是我的唯一, 你是我真命天女] [寶貝兒,我愛你, 你是我的唯一] |
原型模式的優缺點分析:
優點:
1.允許動態地增加或減少產品類。由於建立產品類執行個體的方法是產品類內部具有的,因此增加新產品對整個結構沒有影響。
2.提供簡化的建立結構。
3.具有給一個應用軟體動態載入新功能的能力。
4.產品類不需要非得有任何事先確定的等級結構,因為原型模式適用於任何的等級結構。
缺點:
每一個類都必須配備一個複製方法,這對於全新的類來說不是很難,而對已有的類來說實現clone()方法不一定很容易,而且在進行比較深層次的複製的時候也需要編寫一定工作量的代碼
原型模式的實際應用簡介:
原型對象一般在適用於一下情境:
在建立對象的時候,我們不僅希望被建立的對象繼承其類的基本機構,而且還希望繼承原型對象的資料。
希望對目標對象的修改不影響既有的原型對象(深度複製的時候可以完全互不影響)。
隱藏複製操作的細節。很多時候,對對象本身的複製需要涉及到類本身的資料細節。
溫馨提示:
因為使用原型模式的時候每個類都要具備複製方法。如果在類的設計之初沒有很好的規劃,等使用很久了才想到複製,就可能非常的麻煩,尤其是在設計到深層次複製的時候,因為此時牽扯到很多因素,而且工作量非常大。
在給女朋友複製肉麻情話的之前必須充分檢查,做適當的修改,別搞的發過去的情話中有參見某某具體網址的情況出現,否則的話,你就死定了O(∩_∩)O哈!