天天看點

Java設計模式(五)----原型模式

原型模式(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類型的資料前後都是指向不同的位址空間,改變一個不會影響其他的對象

淺度克隆圖如下

Java設計模式(五)----原型模式
Java設計模式(五)----原型模式

但是如果包含引用類型比如對象、數組、集合等,就隻會克隆引用,結果指向同一個引用位址

結果:

[湯小高, 周小思]

[湯小高, 周小思, tsy]

true

學校名: 清華

學校名: 北大

我隻改變了p1 結果p2也變了 原因如下圖,共享一個引用

Java設計模式(五)----原型模式

這時候就需要使用深度克隆了!

除了淺度克隆要克隆的值外,還負責克隆引用類型的資料。那些引用其他對象的變量将指向被複制過的新對象,而不再是原有的那些被引用的對象。換言之,深度克隆把要複制的對象所引用的對象都複制了一遍,而這種對被引用到的對象的複制叫做間接複制。

深度克隆要深入到多少層,是一個不易确定的問題。在決定以深度克隆的方式複制一個對象的時候,必須決定對間接複制的對象時采取淺度克隆還是繼續

采用深度克隆。是以,在采取深度克隆時,需要決定多深才算深。此外,在深度克隆的過程中,很可能會出現循環引用的問題,必須小心處理。

要實作深度克隆 必須修改clone()方法

測試類同上

false

我修改了p1,p2的值沒有改變 原因如下

深度克隆圖如下

Java設計模式(五)----原型模式

以上内容來自平時所看書籍和網絡資源整理測試所得,如有不完善之處,歡迎指正!