Go設計模式之原型模式講解和代碼示例
Go 原型模式講解和代碼示例
所有的原型類都必須有一個通用的接口, 使得即使在對象所屬的具體類未知的情況下也能復制對象。 原型對象可以生成自身的完整副本, 因為相同類的對象可以相互訪問對方的私有成員變量。
概念示例
讓我們嘗試通過基于操作系統(tǒng)文件系統(tǒng)的示例來理解原型模式。 操作系統(tǒng)的文件系統(tǒng)是遞歸的: 文件夾中包含文件和文件夾, 其中又包含文件和文件夾, 以此類推。
每個文件和文件夾都可用一個 inode
接口來表示。 inode
接口中同樣也有 clone
克隆功能。
file
文件和 folder
文件夾結構體都實現(xiàn)了 print
打印和 clone
方法, 因為它們都是 inode
類型。 同時, 注意 file
和 folder
中的 clone
方法。 這兩者的 clone
方法都會返回相應文件或文件夾的副本。 同時在克隆過程中, 我們會在其名稱后面添加 “_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í)行結果
Print hierarchy for folder2
folder2
folder1
file1
file2
file3Printing hierarchy for clone Folder
folder2_clone
folder1_clone
file1_clone
file2_clone
file3_clone
到此這篇關于Go設計模式之原型模式講解和代碼示例的文章就介紹到這了,更多相關Go 原型模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Go語言中切片(slice)和數(shù)組(array)的區(qū)別詳解
Go語言中切片(slice)和數(shù)組(array)是兩種不同的數(shù)據(jù)結構,它們在用法和行為上有一些重要區(qū)別,所以本文就通過一些代碼示例給大家詳細的介紹一下Go語言中切片(slice)和數(shù)組(array)的區(qū)別,需要的朋友可以參考下2023-09-09Golang?channel關閉后是否可以讀取剩余的數(shù)據(jù)詳解
這篇文章主要介紹了Golang?channel關閉后是否可以讀取剩余的數(shù)據(jù),文章通過一個測試例子給大家詳細的介紹了是否可以讀取剩余的數(shù)據(jù),需要的朋友可以參考下2023-09-09Golang多線程下載器實現(xiàn)高效快速地下載大文件
Golang多線程下載器是一種高效、快速地下載大文件的方法。Golang語言天生支持并發(fā)和多線程,可以輕松實現(xiàn)多線程下載器的開發(fā)。通過使用Golang的協(xié)程和通道,可以將下載任務分配到多個線程中并行處理,提高了下載的效率和速度2023-05-05gin正確多次讀取http?request?body內(nèi)容實現(xiàn)詳解
這篇文章主要為大家介紹了gin正確多次讀取http?request?body內(nèi)容實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01在Go中動態(tài)替換SQL查詢中的日期參數(shù)的完整步驟
在處理數(shù)據(jù)庫查詢時,經(jīng)常需要根據(jù)不同的輸入條件動態(tài)地構造SQL語句,尤其是在涉及日期范圍的查詢中,能夠根據(jù)實際需求調(diào)整查詢的起始和結束日期顯得尤為重要,在本文中,我將介紹如何在Go語言中實現(xiàn)動態(tài)替換SQL查詢中的日期參數(shù),需要的朋友可以參考下2024-11-11