1. 程式人生 > 實用技巧 >原型模式(Prototype Pattern)

原型模式(Prototype Pattern)

原型模式:使用克隆技術複製建立複雜的或者構造耗時的例項,被複制的物件就是所謂的“原型”。

應用場景

  • a、類初始化需要消耗非常多的資源,包括資料庫、硬體資源等,使用拷貝可避免這些消耗
  • b、new產生的物件需要非常繁瑣的資料準備或許可權
  • c、Spring框架中的多例就是使用原型

如何實現

  • (1)實現Cloneable介面,只有實現了這個介面的類才可以被拷貝,否則在執行時會丟擲CloneNotSupportedException異常。
  • (2)重寫Object類中的clone方法。Object類中的clone方法是protected型別,Prototype類需要將clone方法的作用域修改為public型別

淺拷貝與深拷貝

淺複製:只是拷貝了基本型別的資料,而引用型別資料,複製後也是會發生引用,我們把這種拷貝叫做“(淺複製)淺拷貝”。
換句話說,淺複製僅僅是指向被複制的記憶體地址,如果原地址中物件被改變了,那麼淺複製出來的物件也會相應改變。
深複製:在計算機中開闢了一塊新的記憶體地址用於存放複製的物件。

原型模式的核心程式碼及效果

/**預設是淺克隆,基本型別和封裝型別(int、Integer、String)等都會被克隆,但引用型別ArrayList只是地址被複制,不會開闢新的空間
* 列印結果:
* book1原始資料showBook():
* {"age":22,"image":["圖1"],"num":2,"title":"書1"}
* book2直接克隆後showBook():
* {"age":22,"image":["圖1"],"num":2,"title":"書1"}
* book2修改資料後showBook():
* {"age":33,"image":["圖1","圖2"],"num":3,"title":"書2"}
* book1被克隆資料showBook():
* {"age":22,"image":["圖1","圖2"],"num":2,"title":"書1"}
*/
Book book = (Book) super.clone();
/**
* 下面開啟深複製後的列印結果:
* book1原始資料showBook():
* {"age":22,"image":["圖1"],"num":2,"title":"書1"}
* book2直接克隆後showBook():
* {"age":22,"image":["圖1"],"num":2,"title":"書1"}
* book2修改資料後showBook():
* {"age":33,"image":["圖1","圖2"],"num":3,"title":"書2"}
* book1被克隆資料showBook():
* {"age":22,"image":["圖1"],"num":2,"title":"書1"}
*/
book.image=(ArrayList<String>)this.image.clone();

更多文章請關注[迦葉主站]http://jarye.cn