欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go設(shè)計(jì)模式之原型模式圖文詳解

 更新時(shí)間:2023年07月19日 08:43:03   作者:demo007x  
原型模式是一種創(chuàng)建型設(shè)計(jì)模式, 使你能夠復(fù)制已有對(duì)象, 而又無(wú)需使代碼依賴(lài)它們所屬的類(lèi),本文將通過(guò)圖片和文字讓大家可以詳細(xì)的了解Go的原型模式,感興趣的通過(guò)跟著小編一起來(lái)看看吧

原型模式

原型模式是一種創(chuàng)建型設(shè)計(jì)模式, 使你能夠復(fù)制已有對(duì)象, 而又無(wú)需使代碼依賴(lài)它們所屬的類(lèi)。

所有的原型類(lèi)都必須有一個(gè)通用的接口, 使得即使在對(duì)象所屬的具體類(lèi)未知的情況下也能復(fù)制對(duì)象。 原型對(duì)象可以生成自身的完整副本, 因?yàn)橄嗤?lèi)的對(duì)象可以相互訪問(wèn)對(duì)方的私有成員變量。

問(wèn)題

如果你有一個(gè)對(duì)象, 并希望生成與其完全相同的一個(gè)復(fù)制品, 你該如何實(shí)現(xiàn)呢? 首先, 你必須新建一個(gè)屬于相同類(lèi)的對(duì)象。 然后, 你必須遍歷原始對(duì)象的所有成員變量, 并將成員變量值復(fù)制到新對(duì)象中。

不錯(cuò)! 但有個(gè)小問(wèn)題。 并非所有對(duì)象都能通過(guò)這種方式進(jìn)行復(fù)制, 因?yàn)橛行?duì)象可能擁有私有成員變量, 它們?cè)趯?duì)象本身以外是不可見(jiàn)的。

“從外部” 復(fù)制對(duì)象并非總是可行。

直接復(fù)制還有另外一個(gè)問(wèn)題。 因?yàn)槟惚仨氈缹?duì)象所屬的類(lèi)才能創(chuàng)建復(fù)制品, 所以代碼必須依賴(lài)該類(lèi)。 即使你可以接受額外的依賴(lài)性, 那還有另外一個(gè)問(wèn)題: 有時(shí)你只知道對(duì)象所實(shí)現(xiàn)的接口, 而不知道其所屬的具體類(lèi), 比如可向方法的某個(gè)參數(shù)傳入實(shí)現(xiàn)了某個(gè)接口的任何對(duì)象。

解決方案

原型模式將克隆過(guò)程委派給被克隆的實(shí)際對(duì)象。 模式為所有支持克隆的對(duì)象聲明了一個(gè)通用接口, 該接口讓你能夠克隆對(duì)象, 同時(shí)又無(wú)需將代碼和對(duì)象所屬類(lèi)耦合。 通常情況下, 這樣的接口中僅包含一個(gè) 克隆方法。

所有的類(lèi)對(duì) 克隆方法的實(shí)現(xiàn)都非常相似。 該方法會(huì)創(chuàng)建一個(gè)當(dāng)前類(lèi)的對(duì)象, 然后將原始對(duì)象所有的成員變量值復(fù)制到新建的類(lèi)中。 你甚至可以復(fù)制私有成員變量, 因?yàn)榻^大部分編程語(yǔ)言都允許對(duì)象訪問(wèn)其同類(lèi)對(duì)象的私有成員變量。

支持克隆的對(duì)象即為原型。 當(dāng)你的對(duì)象有幾十個(gè)成員變量和幾百種類(lèi)型時(shí), 對(duì)其進(jìn)行克隆甚至可以代替子類(lèi)的構(gòu)造。

預(yù)生成原型可以代替子類(lèi)的構(gòu)造。

其運(yùn)作方式如下: 創(chuàng)建一系列不同類(lèi)型的對(duì)象并不同的方式對(duì)其進(jìn)行配置。 如果所需對(duì)象與預(yù)先配置的對(duì)象相同, 那么你只需克隆原型即可, 無(wú)需新建一個(gè)對(duì)象。

真實(shí)世界類(lèi)比

現(xiàn)實(shí)生活中, 產(chǎn)品在得到大規(guī)模生產(chǎn)前會(huì)使用原型進(jìn)行各種測(cè)試。 但在這種情況下, 原型只是一種被動(dòng)的工具, 不參與任何真正的生產(chǎn)活動(dòng)。

一個(gè)細(xì)胞的分裂。

由于工業(yè)原型并不是真正意義上的自我復(fù)制, 因此細(xì)胞有絲分裂 (還記得生物學(xué)知識(shí)嗎?) 或許是更恰當(dāng)?shù)念?lèi)比。 有絲分裂會(huì)產(chǎn)生一對(duì)完全相同的細(xì)胞。 原始細(xì)胞就是一個(gè)原型, 它在復(fù)制體的生成過(guò)程中起到了推動(dòng)作用。

原型模式結(jié)構(gòu)

基本實(shí)現(xiàn)

  • 原型 (Prototype) 接口將對(duì)克隆方法進(jìn)行聲明。 在絕大多數(shù)情況下, 其中只會(huì)有一個(gè)名為 clone克隆的方法。
  • 具體原型 (Concrete Prototype) 類(lèi)將實(shí)現(xiàn)克隆方法。 除了將原始對(duì)象的數(shù)據(jù)復(fù)制到克隆體中之外, 該方法有時(shí)還需處理克隆過(guò)程中的極端情況, 例如克隆關(guān)聯(lián)對(duì)象和梳理遞歸依賴(lài)等等。
  • 客戶(hù)端 (Client) 可以復(fù)制實(shí)現(xiàn)了原型接口的任何對(duì)象。

原型注冊(cè)表實(shí)現(xiàn)

  • 原型注冊(cè)表 (Prototype Registry) 提供了一種訪問(wèn)常用原型的簡(jiǎn)單方法, 其中存儲(chǔ)了一系列可供隨時(shí)復(fù)制的預(yù)生成對(duì)象。 最簡(jiǎn)單的注冊(cè)表原型是一個(gè) 名稱(chēng) → 原型的哈希表。 但如果需要使用名稱(chēng)以外的條件進(jìn)行搜索, 你可以創(chuàng)建更加完善的注冊(cè)表版本。

偽代碼

在本例中, 原型模式能讓你生成完全相同的幾何對(duì)象副本, 同時(shí)無(wú)需代碼與對(duì)象所屬類(lèi)耦合。

克隆一系列位于同一類(lèi)層次結(jié)構(gòu)中的對(duì)象。

所有形狀類(lèi)都遵循同一個(gè)提供克隆方法的接口。 在復(fù)制自身成員變量值到結(jié)果對(duì)象前, 子類(lèi)可調(diào)用其父類(lèi)的克隆方法。

原型模式適合應(yīng)用場(chǎng)景

如果你需要復(fù)制一些對(duì)象, 同時(shí)又希望代碼獨(dú)立于這些對(duì)象所屬的具體類(lèi), 可以使用原型模式。

這一點(diǎn)考量通常出現(xiàn)在代碼需要處理第三方代碼通過(guò)接口傳遞過(guò)來(lái)的對(duì)象時(shí)。 即使不考慮代碼耦合的情況, 你的代碼也不能依賴(lài)這些對(duì)象所屬的具體類(lèi), 因?yàn)槟悴恢浪鼈兊木唧w信息。

原型模式為客戶(hù)端代碼提供一個(gè)通用接口, 客戶(hù)端代碼可通過(guò)這一接口與所有實(shí)現(xiàn)了克隆的對(duì)象進(jìn)行交互, 它也使得客戶(hù)端代碼與其所克隆的對(duì)象具體類(lèi)獨(dú)立開(kāi)來(lái)。

如果子類(lèi)的區(qū)別僅在于其對(duì)象的初始化方式, 那么你可以使用該模式來(lái)減少子類(lèi)的數(shù)量。 別人創(chuàng)建這些子類(lèi)的目的可能是為了創(chuàng)建特定類(lèi)型的對(duì)象。

在原型模式中, 你可以使用一系列預(yù)生成的、 各種類(lèi)型的對(duì)象作為原型。

客戶(hù)端不必根據(jù)需求對(duì)子類(lèi)進(jìn)行實(shí)例化, 只需找到合適的原型并對(duì)其進(jìn)行克隆即可。

實(shí)現(xiàn)方式

  • 創(chuàng)建原型接口, 并在其中聲明 克隆方法。 如果你已有類(lèi)層次結(jié)構(gòu), 則只需在其所有類(lèi)中添加該方法即可。

  • 原型類(lèi)必須另行定義一個(gè)以該類(lèi)對(duì)象為參數(shù)的構(gòu)造函數(shù)。 構(gòu)造函數(shù)必須復(fù)制參數(shù)對(duì)象中的所有成員變量值到新建實(shí)體中。 如果你需要修改子類(lèi), 則必須調(diào)用父類(lèi)構(gòu)造函數(shù), 讓父類(lèi)復(fù)制其私有成員變量值。

    如果編程語(yǔ)言不支持方法重載, 那么你可能需要定義一個(gè)特殊方法來(lái)復(fù)制對(duì)象數(shù)據(jù)。 在構(gòu)造函數(shù)中進(jìn)行此類(lèi)處理比較方便, 因?yàn)樗谡{(diào)用 new運(yùn)算符后會(huì)馬上返回結(jié)果對(duì)象。

  • 克隆方法通常只有一行代碼: 使用 new運(yùn)算符調(diào)用原型版本的構(gòu)造函數(shù)。 注意, 每個(gè)類(lèi)都必須顯式重寫(xiě)克隆方法并使用自身類(lèi)名調(diào)用 new運(yùn)算符。 否則, 克隆方法可能會(huì)生成父類(lèi)的對(duì)象。

  • 你還可以創(chuàng)建一個(gè)中心化原型注冊(cè)表, 用于存儲(chǔ)常用原型。

    你可以新建一個(gè)工廠類(lèi)來(lái)實(shí)現(xiàn)注冊(cè)表, 或者在原型基類(lèi)中添加一個(gè)獲取原型的靜態(tài)方法。 該方法必須能夠根據(jù)客戶(hù)端代碼設(shè)定的條件進(jìn)行搜索。 搜索條件可以是簡(jiǎn)單的字符串, 或者是一組復(fù)雜的搜索參數(shù)。 找到合適的原型后, 注冊(cè)表應(yīng)對(duì)原型進(jìn)行克隆, 并將復(fù)制生成的對(duì)象返回給客戶(hù)端。

    最后還要將對(duì)子類(lèi)構(gòu)造函數(shù)的直接調(diào)用替換為對(duì)原型注冊(cè)表工廠方法的調(diào)用。

原型模式優(yōu)缺點(diǎn)

  • 你可以克隆對(duì)象, 而無(wú)需與它們所屬的具體類(lèi)相耦合。

  • 你可以克隆預(yù)生成原型, 避免反復(fù)運(yùn)行初始化代碼。

  • 你可以更方便地生成復(fù)雜對(duì)象。

  • 你可以用繼承以外的方式來(lái)處理復(fù)雜對(duì)象的不同配置。

  • 克隆包含循環(huán)引用的復(fù)雜對(duì)象可能會(huì)非常麻煩。

代碼示例

Go設(shè)計(jì)模式之原型模式講解和代碼示例_Golang_腳本之家 (jb51.net)

以上就是Go設(shè)計(jì)模式之原型模式圖文詳解的詳細(xì)內(nèi)容,更多關(guān)于Go原型模式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Golang使用MongoDB通用操作

    詳解Golang使用MongoDB通用操作

    這篇文章主要介紹了詳解Golang使用MongoDB通用操作,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 解決go echo后端處理跨域的兩種操作方式

    解決go echo后端處理跨域的兩種操作方式

    這篇文章主要介紹了解決go echo后端處理跨域的兩種操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • 詳解Golang如何實(shí)現(xiàn)支持隨機(jī)刪除元素的堆

    詳解Golang如何實(shí)現(xiàn)支持隨機(jī)刪除元素的堆

    堆是一種非常常用的數(shù)據(jù)結(jié)構(gòu),它能夠支持在O(1)的時(shí)間復(fù)雜度獲取到最大值(或最小值)。本文主要介紹了如何實(shí)現(xiàn)支持O(log(n))隨機(jī)刪除元素的堆,需要的可以參考一下
    2022-09-09
  • Golang 1.16 中 Modules的主要變化更新

    Golang 1.16 中 Modules的主要變化更新

    這篇文章主要介紹了Golang 1.16 中 Modules的主要變化更新,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • GO語(yǔ)言入門(mén)學(xué)習(xí)之基本數(shù)據(jù)類(lèi)型字符串

    GO語(yǔ)言入門(mén)學(xué)習(xí)之基本數(shù)據(jù)類(lèi)型字符串

    字符串在Go語(yǔ)言中以原生數(shù)據(jù)類(lèi)型出現(xiàn),使用字符串就像使用其他原生數(shù)據(jù)類(lèi)型(int、bool、float32、float64 等)一樣,下面這篇文章主要給大家介紹了關(guān)于GO語(yǔ)言入門(mén)學(xué)習(xí)之基本數(shù)據(jù)類(lèi)型字符串的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • Go語(yǔ)言開(kāi)發(fā)kube-scheduler整體架構(gòu)深度剖析

    Go語(yǔ)言開(kāi)發(fā)kube-scheduler整體架構(gòu)深度剖析

    這篇文章主要為大家介紹了Go語(yǔ)言開(kāi)發(fā)kube-scheduler整體架構(gòu)深度剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Golang通過(guò)包長(zhǎng)協(xié)議處理TCP粘包的問(wèn)題解決

    Golang通過(guò)包長(zhǎng)協(xié)議處理TCP粘包的問(wèn)題解決

    本文主要介紹了Golang通過(guò)包長(zhǎng)協(xié)議處理TCP粘包的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Go中的 panic / recover 簡(jiǎn)介與實(shí)踐記錄

    Go中的 panic / recover 簡(jiǎn)介與實(shí)踐記錄

    這篇文章主要介紹了Go中的 panic / recover 簡(jiǎn)介與實(shí)踐,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • GO語(yǔ)言實(shí)現(xiàn)標(biāo)題閃爍效果

    GO語(yǔ)言實(shí)現(xiàn)標(biāo)題閃爍效果

    這篇文章主要介紹了GO語(yǔ)言實(shí)現(xiàn)標(biāo)題閃爍效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Golang中runtime的使用詳解

    Golang中runtime的使用詳解

    這篇文章主要介紹了Golang中runtime的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08

最新評(píng)論