91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

prototype模式實現時要考慮什么問題

發布時間:2022-01-13 17:11:30 來源:億速云 閱讀:104 作者:iii 欄目:大數據

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

實現

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

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

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

當一個系統中原型數目不固定時(也就是說,它們可以動態創建和銷毀),要保持一個可用原型的注冊表。客戶不會自己來管理原型,但會在注冊表中存儲和檢索原型。客戶在克隆一個原型前會向注冊表請求該原型。我們稱這個注冊表為原型管理器(prototype manager)。

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

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

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

2 ) 實現克隆操作

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

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

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

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

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

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

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

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

3) 初始化克隆對象

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

傳遞參數會破壞克隆接口的統一性。

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

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

在修改克隆得到對象的時候,如果已經存在修改狀態(或屬性)的操作,直接使用就好;如果沒有就需要引入一個initialize操作(而不是增加設定操作)。克隆操作是深拷貝的時候需要注意,有些成員在初始化之前需要先刪除通過克隆得到的內容。這個刪除可以是顯式的,也可以在Initialize內部進行。

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

向AI問一下細節

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

AI

民乐县| 都昌县| 塘沽区| 建始县| 湛江市| 鹤庆县| 内江市| 海原县| 特克斯县| 湾仔区| 额敏县| 德惠市| 哈密市| 平乐县| 金寨县| 二连浩特市| 久治县| 贺兰县| 光山县| 伊宁市| 定远县| 平江县| 紫阳县| 甘德县| 夏河县| 六盘水市| 弥勒县| 合阳县| 新化县| 临沭县| 宁晋县| 屯留县| 江口县| 河南省| 延寿县| 称多县| 常州市| 吴堡县| 沁源县| 浏阳市| 丰都县|