溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

prototype模式實現(xiàn)時要考慮什么問題

發(fā)布時間:2022-01-13 17:11:30 來源:億速云 閱讀:103 作者:iii 欄目:大數(shù)據(jù)

本篇內容介紹了“prototype模式實現(xiàn)時要考慮什么問題”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

實現(xiàn)

因為在像C++這樣的靜態(tài)語言中,類不是對象,并且運行時刻只能得到很少或者得不到任何類型信息,所以Prototype特別有用。而在Smalltalk或Objective C這樣的語言中Prototype就不是那么重要了,因為這些語言提供了一個等價于原型的東西(即類對象)來創(chuàng)建每個類的實例。Prototype模式在像Self [US87]這樣基于原型的語言中是固有的,所有對象的創(chuàng)建都是通過克隆一個原型實現(xiàn)的。

簡單說就是在C++中沒有提供原型機制,所以需要自己構建原型模式;反之,對于語言中已經(jīng)提供等價機制的時候,直接使用就好。

當實現(xiàn)原型時,要考慮下面一些問題:
1 ) 使用一個原型管理器

當一個系統(tǒng)中原型數(shù)目不固定時(也就是說,它們可以動態(tài)創(chuàng)建和銷毀),要保持一個可用原型的注冊表??蛻舨粫约簛砉芾碓?,但會在注冊表中存儲和檢索原型??蛻粼诳寺∫粋€原型前會向注冊表請求該原型。我們稱這個注冊表為原型管理器(prototype manager)。

對于原型可以動態(tài)創(chuàng)建的情況,需要有個地方存放它們以備需要時使用。這個管理機制就是原型管理器。它至少對外提供兩個功能,登錄和檢索。一個是輸入原型,一個是輸出原型。注意這里的客戶指的是用原型的模塊而不是軟件的使用者。

原型管理器是一個關聯(lián)存儲器( associative store),它返回一個與給定關鍵字相匹配的原型。它有一些操作可以用來通過關鍵字注冊原型和解除注冊??蛻艨梢栽谶\行時更改甚或瀏覽這個注冊表。這使得客戶無需編寫代碼就可以擴展并得到系統(tǒng)清單。

關聯(lián)指的是關鍵字和原型之間的關系。原型的登錄和檢索都需要這種關系。通常情況下,還需要瀏覽已經(jīng)登錄的原型的機制,這樣客戶即使完全不知道這些原型是怎么來的也可以方便地使用它們了。

2 ) 實現(xiàn)克隆操作

Prototype模式最困難的部分在于正確實現(xiàn)Clone操作。當對象結構包含循環(huán)引用時,這尤為棘手。

例如C++中,A,B兩個對象循環(huán)引用的情況,由于這是A,B兩個對象都至少出現(xiàn)兩次,在進行Clone操作時需要用某種方式(硬編碼或者某種識別機制)來決定哪個是實體,哪個是引用。

大多數(shù)語言都對克隆對象提供了一些支持。例如,Smalltalk提供了一個copy的實現(xiàn),它被所有Object的子類所繼承。C++提供了一個拷貝構造器。但這些設施并不能解決“淺拷貝和深拷貝”問題[GR83]。也就是說,克隆一個對象是依次克隆它的實例變量呢,或者還是由克隆對象和原對象共享這些變量?

考慮C++中克隆操作的情況,假設某個類有一個指針類型的數(shù)據(jù)成員指向另外一個對象,克隆處理如何知道這個對象是類組成的一部分(需要克隆)還是某個共通對象的參照(不需要克?。┠??

淺拷貝簡單并且通常也足夠了,它是Smalltalk所缺省提供的。C++中的缺省拷貝構造器實現(xiàn)按成員拷貝,這意味著在拷貝的和原來的對象之間是共享指針的。但克隆一個結構復雜的原型通常需要深拷貝,因為復制對象和原對象必須相互獨立。因此你必須保證克隆對象的構件也是對原型的構件的克隆??寺∑仁鼓銢Q定如果所有東西都被共享了該怎么辦。

就像實例化類得到的對象,克隆得到的對象也會被獨立使用。所以必須使用深拷貝而不是淺拷貝。在進行Clone處理時,還必須考慮在所有對象都是共享的情況下該怎么做(這句可能不準確,但實在沒有更好的說法了)。

如果系統(tǒng)中的對象提供了Save和Load操作,那么你只需通過保存對象和立刻載入對象,就可以為Clone操作提供一個缺省實現(xiàn)。 Save操作將該對象保存在內存緩沖區(qū)中,而Load則通過從該緩沖區(qū)中重構這個對象來創(chuàng)建一個復本。

這種方式省去了直接硬編碼克隆的麻煩。但是需要另外的空間來保存數(shù)據(jù)。很多時候會使用語言庫中提供的系列化功能。

3) 初始化克隆對象

當一些客戶對克隆對象已經(jīng)相當滿意時,另一些客戶將會希望使用他們所選擇的一些值來初始化該對象的一些或是所有的內部狀態(tài)。一般來說不可能在Clone操作中傳遞這些值,因為這些值的數(shù)目由于原型的類的不同而會有所不同。一些原型可能需要多個初始化參數(shù),另一些可能什么也不要。在Clone操作中

傳遞參數(shù)會破壞克隆接口的統(tǒng)一性。

一般來講都會希望對克隆得到的對象進行一定程度的修改。但是因為這種修改會隨著類的不同,應用場景的不同而有所變化,所以不大可能通過Clone處理的參數(shù)來消化。通常的做法是得到對象以后進行修改。

可能會這樣,原型的類已經(jīng)為(重)設定一些關鍵的狀態(tài)值定義好了操作。如果這樣的話,客戶在克隆后馬上就可以使用這些操作。否則,你就可能不得不引入一個Initialize操作(參見代碼示例一節(jié)),該操作使用初始化參數(shù)并據(jù)此設定克隆對象的內部狀態(tài)。注意深拷貝Clone操作——一些復制在你重新初始化它們之前可能必須要被刪除掉(刪除可以顯式地做也可以在I n i t i a l i z e內部做)。

在修改克隆得到對象的時候,如果已經(jīng)存在修改狀態(tài)(或屬性)的操作,直接使用就好;如果沒有就需要引入一個initialize操作(而不是增加設定操作)??寺〔僮魇巧羁截惖臅r候需要注意,有些成員在初始化之前需要先刪除通過克隆得到的內容。這個刪除可以是顯式的,也可以在Initialize內部進行。

“prototype模式實現(xiàn)時要考慮什么問題”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網(wǎng)站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI