原型模式(prototype)
一、概述
二、結構
三、淺度克隆和深度克隆
淺度克隆
深度克隆
定義:原型模式屬于對象的建立模式。通過給出一個原型對象來指明所有建立的對象的類型,然後用複制這個原型對象的辦法建立出更多同類型的對象。簡言之:就是複制粘貼。這就是選型模式的用意。
原型模式主要用于對象的複制,它的核心是就是類圖中的原型類prototype。prototype類需要具備以下兩個條件:
1、實作cloneable接口。在java語言有一個cloneable接口,它的作用隻有一個,就是在運作時通知虛拟機可以安全地在實作了此接
口的類上使用clone方法。在java虛拟機中,隻有實作了這個接口的類才可以被拷貝,否則在運作時會抛出
clonenotsupportedexception異常。
2、重寫object類中的clone方法。java中,所有類的父類都是
object類,object類中有一個clone方法,作用是傳回對象的一個拷貝,但是其作用域protected類型的,一般的類無法調用,因
此,prototype類需要将clone方法的作用域修改為public類型。
隻負責克隆按值傳遞的資料(比如基本資料類型、string類型),而不複制它所引用的對象,換言之,所有的對其他對象的引用都仍然指向原來的對象。
結果:
前後位址相同嗎: false
輸出p1:湯高 20
輸出p2:湯高 20
輸出p2:周思遠 19
通過上訴測試可知對于基本類型和string類型的資料前後都是指向不同的位址空間,改變一個不會影響其他的對象
淺度克隆圖如下
但是如果包含引用類型比如對象、數組、集合等,就隻會克隆引用,結果指向同一個引用位址
結果:
[湯小高, 周小思]
[湯小高, 周小思, tsy]
true
學校名: 清華
學校名: 北大
我隻改變了p1 結果p2也變了 原因如下圖,共享一個引用
這時候就需要使用深度克隆了!
除了淺度克隆要克隆的值外,還負責克隆引用類型的資料。那些引用其他對象的變量将指向被複制過的新對象,而不再是原有的那些被引用的對象。換言之,深度克隆把要複制的對象所引用的對象都複制了一遍,而這種對被引用到的對象的複制叫做間接複制。
深度克隆要深入到多少層,是一個不易确定的問題。在決定以深度克隆的方式複制一個對象的時候,必須決定對間接複制的對象時采取淺度克隆還是繼續
采用深度克隆。是以,在采取深度克隆時,需要決定多深才算深。此外,在深度克隆的過程中,很可能會出現循環引用的問題,必須小心處理。
要實作深度克隆 必須修改clone()方法
測試類同上
false
我修改了p1,p2的值沒有改變 原因如下
深度克隆圖如下
以上内容來自平時所看書籍和網絡資源整理測試所得,如有不完善之處,歡迎指正!