設計模式 --- 原型模式
阿新 • • 發佈:2018-11-22
1.定義
用原型例項建立指定物件的種類,並通過複製這些原型建立新物件。
2.使用場景
a.類初始化需要消耗非常多的資源,包括資料資源、硬體資源,通過原型複製,避免這種資源消耗。
b.通過new產生一個物件需要非常繁瑣的資料準備或訪問許可權。
c.一個物件需要提供給其他物件訪問,而且各個呼叫者都需要修改其值時,可以考慮複製多個物件供呼叫者使用,實現保護性拷貝。
3.簡單實現
通過實現Cloneable介面和覆寫clone方法實現原型模式
//文件物件 實現Cloneable介面 public class WordDoc implements Cloneable{ private String txt; private String mImages ; public WordDoc(){ System.out.print("WordDoc建構函式"); } public String getTxt() { return txt; } public void setTxt(String txt) { this.txt = txt; } public String getmImages() { return mImages; } public void setmImages(String mImages) { this.mImages = mImages; } public String showDoc() { return " Word txt:" + txt +" , imgs: " + mImages +" "; } //覆寫clone方法 @Override protected WordDoc clone() { try { WordDoc doc = (WordDoc) super.clone(); doc.txt = this.txt; doc.mImages = this.mImages; return doc; }catch (Exception e){ e.printStackTrace(); } return null; } }
public static void main(String[] args){ //建立一個原始文件 WordDoc wordDoc = new WordDoc(); wordDoc.setTxt("原始文件"); wordDoc.setmImages("原始圖片"); System.out.print("\n" + wordDoc.showDoc()); //以原始文件為原型 拷貝副本 WordDoc doc1 = wordDoc.clone(); System.out.print("\n"+ doc1.showDoc()); //修改副本 doc1.setTxt("doc1 修改"); doc1.setmImages("doc1 修改圖片"); System.out.print("\n" + doc1.showDoc()); //檢視原始文件 System.out.print("\n" + wordDoc.showDoc()); }
輸出:
注意clone方法並不是Cloneable介面中的,而是Object中的方法,Cloneable也是一個介面標識,它表明這個類的物件是可拷貝的,如果沒有實現Cloneable介面卻呼叫了clone()會丟擲異常。
還用通過clone拷貝的物件並不會執行建構函式!如在建構函式中需要有特殊的初始化操作型別,在使用Cloneable實現拷貝的時候需要注意建構函式不會執行。
還需要注意深拷貝淺拷貝問題,即在拷貝物件的時候,對引用型的欄位也要採用拷貝的形式。
4.小結
原型模式本質上是物件的拷貝,可以解決對構建複雜物件資源消耗問題,還有一個重要用途就是保護性拷貝,如果這個物件是隻讀物件,可以通過返回一個物件的拷貝的形式。
優點:
原型模式是記憶體中二進位制流的拷貝,要比直接new物件效能好很多
缺點:
開發過程中要主要建構函式不會執行的問題