最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

原型模式

原型模式是一種創(chuàng)建型設(shè)計(jì)模式, 使你能夠復(fù)制已有對(duì)象, 而又無(wú)需使代碼依賴它們所屬的類(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)。 即使你可以接受額外的依賴性, 那還有另外一個(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ì)象和梳理遞歸依賴等等。
  • 客戶端 (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è) 名稱 → 原型的哈希表。 但如果需要使用名稱以外的條件進(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í)。 即使不考慮代碼耦合的情況, 你的代碼也不能依賴這些對(duì)象所屬的具體類(lèi), 因?yàn)槟悴恢浪鼈兊木唧w信息。

原型模式為客戶端代碼提供一個(gè)通用接口, 客戶端代碼可通過(guò)這一接口與所有實(shí)現(xiàn)了克隆的對(duì)象進(jìn)行交互, 它也使得客戶端代碼與其所克隆的對(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ì)象作為原型。

客戶端不必根據(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ù)客戶端代碼設(shè)定的條件進(jìn)行搜索。 搜索條件可以是簡(jiǎn)單的字符串, 或者是一組復(fù)雜的搜索參數(shù)。 找到合適的原型后, 注冊(cè)表應(yīng)對(duì)原型進(jìn)行克隆, 并將復(fù)制生成的對(duì)象返回給客戶端。

    最后還要將對(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)文章

  • GO語(yǔ)言embed機(jī)制的使用

    GO語(yǔ)言embed機(jī)制的使用

    本文詳細(xì)介紹了Go語(yǔ)言中使用embed機(jī)制將靜態(tài)文件(如圖片、文本和目錄)嵌入到程序中,包括文件轉(zhuǎn)[]byte、string類(lèi)型,以及使用FS結(jié)構(gòu)組合多個(gè)文件和目錄的方法,下面就來(lái)詳細(xì)的介紹一下
    2026-03-03
  • 深入探索Go?1.21中的?maps工具庫(kù)

    深入探索Go?1.21中的?maps工具庫(kù)

    隨著?Go?1.21.0?版本的發(fā)布,新增了兩個(gè)實(shí)用的泛型工具庫(kù):maps?和?slices,下面小編就帶大家一起學(xué)習(xí)一下?maps?工具庫(kù)的相關(guān)知識(shí)吧
    2023-08-08
  • 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
  • Ruby序列化和持久化存儲(chǔ)(Marshal、Pstore)操作方法詳解

    Ruby序列化和持久化存儲(chǔ)(Marshal、Pstore)操作方法詳解

    這篇文章主要介紹了Ruby序列化和持久化存儲(chǔ)(Marshal、Pstore)操作方法詳解,包括Ruby Marshal序列化,Ruby Pstore存儲(chǔ),需要的朋友可以參考下
    2022-04-04
  • Windows環(huán)境下vscode-go安裝筆記(不支持32位)

    Windows環(huán)境下vscode-go安裝筆記(不支持32位)

    這篇文章主要介紹了Windows環(huán)境下vscode-go安裝筆記(不支持32位),需要的朋友可以參考下
    2017-02-02
  • golang 中的 nil的場(chǎng)景分析

    golang 中的 nil的場(chǎng)景分析

    這篇文章主要介紹了golang 中的 nil,本文通過(guò)多種場(chǎng)景分析給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Golang字符串和數(shù)組的相互轉(zhuǎn)換

    Golang字符串和數(shù)組的相互轉(zhuǎn)換

    本文主要介紹了Golang字符串和數(shù)組的相互轉(zhuǎn)換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-06-06
  • go內(nèi)存隊(duì)列l(wèi)ist VS slice實(shí)現(xiàn)方式對(duì)比分析

    go內(nèi)存隊(duì)列l(wèi)ist VS slice實(shí)現(xiàn)方式對(duì)比分析

    這篇文章主要為大家介紹了go內(nèi)存隊(duì)列l(wèi)ist VS slice實(shí)現(xiàn)方式對(duì)比分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • golang查看CPU使用率與內(nèi)存的方法詳解

    golang查看CPU使用率與內(nèi)存的方法詳解

    這篇文章主要給大家介紹了golang查看CPU使用率與內(nèi)存的方法,以及拓展介紹源碼里//go:指令,文中有詳細(xì)的代碼示例以及圖文介紹,需要的朋友可以參考下
    2023-10-10
  • Golang Gin框架中間件的用法詳解

    Golang Gin框架中間件的用法詳解

    中間件是Gin框架中的一個(gè)核心概念,它允許開(kāi)發(fā)者在處理HTTP請(qǐng)求的過(guò)程中插入自定義的鉤子函數(shù),從而實(shí)現(xiàn)諸如日志記錄、身份驗(yàn)證、權(quán)限控制等公共邏輯,本文將結(jié)合實(shí)際案例,詳細(xì)講解Gin框架中間件的用法
    2024-10-10

最新評(píng)論

南通市| 拉萨市| 郧西县| 大悟县| 唐河县| 攀枝花市| 壤塘县| 昭苏县| 威宁| 徐州市| 来安县| 河西区| 托克逊县| 银川市| 贵港市| 甘洛县| 灵山县| 海安县| 泸定县| 灵石县| 姚安县| 大厂| 西林县| 永和县| 广昌县| 徐汇区| 咸宁市| 常州市| 正阳县| 河曲县| 周至县| 彭阳县| 榆社县| 高淳县| 泰和县| 古浪县| 阜平县| 建瓯市| 荆门市| 称多县| 丰宁|