原型模式(Prototype Pattern)
阿新 • • 發佈:2020-11-29
原型模式:使用克隆技術複製建立複雜的或者構造耗時的例項,被複制的物件就是所謂的“原型”。
應用場景
- 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