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

Golang設(shè)計(jì)模式之原型模式詳細(xì)講解

 更新時(shí)間:2023年01月11日 11:47:22   作者:Ch3n  
如果一個(gè)類的有非常多的屬性,層級(jí)還很深。每次構(gòu)造起來(lái),不管是直接構(gòu)造還是用建造者模式,都要對(duì)太多屬性進(jìn)行復(fù)制,那么有沒有一種好的方式讓我們創(chuàng)建太的時(shí)候使用體驗(yàn)更好一點(diǎn)呢? 今天的文章里就給大家介紹一種設(shè)計(jì)模式,來(lái)解決這個(gè)問題

原型模式

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

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

概念示例

讓我們嘗試通過(guò)基于操作系統(tǒng)文件系統(tǒng)的示例來(lái)理解原型模式。 操作系統(tǒng)的文件系統(tǒng)是遞歸的: 文件夾中包含文件和文件夾, 其中又包含文件和文件夾, 以此類推。

每個(gè)文件和文件夾都可用一個(gè) inode接口來(lái)表示。 inode接口中同樣也有 clone克隆功能。

file文件和 folder文件夾結(jié)構(gòu)體都實(shí)現(xiàn)了 print打印和 clone方法, 因?yàn)樗鼈兌际?inode類型。 同時(shí), 注意 file和 folder中的 clone方法。 這兩者的 clone方法都會(huì)返回相應(yīng)文件或文件夾的副本。 同時(shí)在克隆過(guò)程中, 我們會(huì)在其名稱后面添加 “_clone” 字樣。

inode.go: 原型接口

package main
type Inode interface {
    print(string)
    clone() Inode
}

file.go: 具體原型

package main
import "fmt"
type File struct {
    name string
}
func (f *File) print(indentation string) {
    fmt.Println(indentation + f.name)
}
func (f *File) clone() Inode {
    return &File{name: f.name + "_clone"}
}

folder.go: 具體原型

package main
import "fmt"
type Folder struct {
    children []Inode
    name     string
}
func (f *Folder) print(indentation string) {
    fmt.Println(indentation + f.name)
    for _, i := range f.children {
        i.print(indentation + indentation)
    }
}
func (f *Folder) clone() Inode {
    cloneFolder := &Folder{name: f.name + "_clone"}
    var tempChildren []Inode
    for _, i := range f.children {
        copy := i.clone()
        tempChildren = append(tempChildren, copy)
    }
    cloneFolder.children = tempChildren
    return cloneFolder
}

main.go: 客戶端代碼

package main
import "fmt"
func main() {
    file1 := &File{name: "File1"}
    file2 := &File{name: "File2"}
    file3 := &File{name: "File3"}
    folder1 := &Folder{
        children: []Inode{file1},
        name:     "Folder1",
    }
    folder2 := &Folder{
        children: []Inode{folder1, file2, file3},
        name:     "Folder2",
    }
    fmt.Println("\nPrinting hierarchy for Folder2")
    folder2.print("  ")
    cloneFolder := folder2.clone()
    fmt.Println("\nPrinting hierarchy for clone Folder")
    cloneFolder.print("  ")
}

output.txt: 執(zhí)行結(jié)果

Printing hierarchy for Folder2
Folder2
Folder1
File1
File2
File3

Printing hierarchy for clone Folder
Folder2_clone
Folder1_clone
File1_clone
File2_clone
File3_clone

到此這篇關(guān)于Golang設(shè)計(jì)模式之原型模式詳細(xì)講解的文章就介紹到這了,更多相關(guān)Go原型模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang使用sync.singleflight解決熱點(diǎn)緩存穿透問題

    golang使用sync.singleflight解決熱點(diǎn)緩存穿透問題

    在go的sync包中,有一個(gè)singleflight包,里面有一個(gè)?singleflight.go文件,代碼加注釋,一共200行出頭,通過(guò)?singleflight可以很容易實(shí)現(xiàn)緩存和去重的效果,避免重復(fù)計(jì)算,接下來(lái)我們就給大家詳細(xì)介紹一下sync.singleflight如何解決熱點(diǎn)緩存穿透問題
    2023-07-07
  • golang中日期操作之日期格式化及日期轉(zhuǎn)換

    golang中日期操作之日期格式化及日期轉(zhuǎn)換

    在編程中,程序員會(huì)經(jīng)常使用到日期相關(guān)操作,下面這篇文章主要給大家介紹了關(guān)于golang中日期操作之日期格式化及日期轉(zhuǎn)換的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • 詳解Golang中string的實(shí)現(xiàn)原理與高效使用

    詳解Golang中string的實(shí)現(xiàn)原理與高效使用

    在Go語(yǔ)言中,無(wú)論是字符串常量、字符串變量還是代碼中出現(xiàn)的字符串字面量,它們的類型都被統(tǒng)一設(shè)置為string,下面就跟隨小編一起來(lái)了解一下Golang中string的實(shí)現(xiàn)原理與高效使用吧
    2024-01-01
  • Golang filepath包常用函數(shù)詳解

    Golang filepath包常用函數(shù)詳解

    本文介紹與文件路徑相關(guān)包,該工具包位于path/filepath中,該包試圖與目標(biāo)操作系統(tǒng)定義的文件路徑兼容。本文介紹一些常用函數(shù),如獲取文件絕對(duì)路徑,獲取文件名或目錄名、遍歷文件、分割文件路徑、文件名模式匹配等函數(shù),并給具體示例進(jìn)行說(shuō)明
    2023-02-02
  • Go語(yǔ)言實(shí)現(xiàn)的排列組合問題實(shí)例(n個(gè)數(shù)中取m個(gè))

    Go語(yǔ)言實(shí)現(xiàn)的排列組合問題實(shí)例(n個(gè)數(shù)中取m個(gè))

    這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)的排列組合問題,結(jié)合實(shí)例形式分析了Go語(yǔ)言實(shí)現(xiàn)排列組合數(shù)學(xué)運(yùn)算的原理與具體操作技巧,需要的朋友可以參考下
    2017-02-02
  • 詳解Golang 中的并發(fā)限制與超時(shí)控制

    詳解Golang 中的并發(fā)限制與超時(shí)控制

    這篇文章主要介紹了詳解Golang 中的并發(fā)限制與超時(shí)控制,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • 使用gorm.Scopes函數(shù)實(shí)現(xiàn)復(fù)用查詢邏輯示例

    使用gorm.Scopes函數(shù)實(shí)現(xiàn)復(fù)用查詢邏輯示例

    這篇文章主要為大家介紹了使用gorm.Scopes函數(shù)實(shí)現(xiàn)復(fù)用查詢邏輯示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Go分布式鏈路追蹤實(shí)戰(zhàn)探索

    Go分布式鏈路追蹤實(shí)戰(zhàn)探索

    這篇文章主要為大家介紹了Go分布式鏈路追蹤實(shí)戰(zhàn)示例探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Golang實(shí)現(xiàn)AES對(duì)稱加密的過(guò)程詳解

    Golang實(shí)現(xiàn)AES對(duì)稱加密的過(guò)程詳解

    AES是一個(gè)對(duì)稱密碼,旨在取代DES成為廣泛使用的標(biāo)準(zhǔn),本文給大家分享Golang實(shí)現(xiàn)AES對(duì)稱加密的過(guò)程,本文附有Golang實(shí)現(xiàn)AES加密ECB模式的源碼,感興趣的朋友跟隨小編一起學(xué)習(xí)下吧
    2021-05-05
  • 一文帶你了解Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)strings的常用函數(shù)和方法

    一文帶你了解Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)strings的常用函數(shù)和方法

    strings?庫(kù)包含了許多高效的字符串常用操作的函數(shù)和方法,巧用這些函數(shù)與方法,能極大的提高我們程序的性能。本文就來(lái)和大家分享一下Go標(biāo)準(zhǔn)庫(kù)strings的常用函數(shù)和方法,希望對(duì)大家有所幫助
    2022-11-11

最新評(píng)論