Go設(shè)計(jì)模式之原型模式講解和代碼示例
Go 原型模式講解和代碼示例
所有的原型類都必須有一個(gè)通用的接口, 使得即使在對(duì)象所屬的具體類未知的情況下也能復(fù)制對(duì)象。 原型對(duì)象可以生成自身的完整副本, 因?yàn)橄嗤惖膶?duì)象可以相互訪問對(duì)方的私有成員變量。
概念示例
讓我們嘗試通過基于操作系統(tǒng)文件系統(tǒng)的示例來理解原型模式。 操作系統(tǒng)的文件系統(tǒng)是遞歸的: 文件夾中包含文件和文件夾, 其中又包含文件和文件夾, 以此類推。
每個(gè)文件和文件夾都可用一個(gè) inode接口來表示。 inode接口中同樣也有 clone克隆功能。
file文件和 folder文件夾結(jié)構(gòu)體都實(shí)現(xiàn)了 print打印和 clone方法, 因?yàn)樗鼈兌际?inode類型。 同時(shí), 注意 file和 folder中的 clone方法。 這兩者的 clone方法都會(huì)返回相應(yīng)文件或文件夾的副本。 同時(shí)在克隆過程中, 我們會(huì)在其名稱后面添加 “_clone” 字樣。
inode.go: 原型接口
package main
type Inode interface {
printer(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 _, v := range f.children {
v.print(indentation + indentation)
}
}
func (f *Folder) clone() Inode {
cloneFolder := &Folder{name: f.name + "_clone"}
var tempChildren []Inode
for _, v := range f.children {
copy := v.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("Print hierarchy for folder2")
folder2.print(" ")
cloneFolder := folder2.clone()
fmt.Println("\nPrinting hierarchy for clone Folder")
cloneFolder.print(" ")
}output.txt: 執(zhí)行結(jié)果
Print hierarchy for folder2
folder2
folder1
file1
file2
file3Printing hierarchy for clone Folder
folder2_clone
folder1_clone
file1_clone
file2_clone
file3_clone
到此這篇關(guān)于Go設(shè)計(jì)模式之原型模式講解和代碼示例的文章就介紹到這了,更多相關(guān)Go 原型模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang使用泛型結(jié)構(gòu)體實(shí)現(xiàn)封裝切片
這篇文章主要為大家詳細(xì)介紹了golang使用泛型結(jié)構(gòu)體實(shí)現(xiàn)封裝切片,即封裝切片的增、刪、改、查、長度大小、ForEach(遍歷切片),感興趣的小伙伴可以學(xué)習(xí)一下2023-10-10
Go語言sync.Pool對(duì)象池使用場(chǎng)景基本示例
這篇文章主要為大家介紹了Go語言sync.Pool對(duì)象池使用場(chǎng)景的基本示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
goland中導(dǎo)包報(bào)紅和go mod問題
這篇文章主要介紹了goland中導(dǎo)包報(bào)紅和go mod問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
詳解Golang如何監(jiān)聽某個(gè)函數(shù)的開始執(zhí)行和執(zhí)行結(jié)束
這篇文章主要為大家詳細(xì)介紹了Golang如何監(jiān)聽某個(gè)函數(shù)的開始執(zhí)行和執(zhí)行結(jié)束,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下2024-02-02
goland Duration 和time的區(qū)別說明
這篇文章主要介紹了goland Duration 和time的區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12

