01概念示例
让我们尝试通过基于操作系统文件系统的示例来理解原型模式。 操作系统的文件系统是递归的: 文件夹中包含文件和文件夹, 其中又包含文件和文件夹, 以此类推。
每个文件和文件夹都可用一个 inode
接口来表示。 inode
接口中同样也有 clone
克隆功能。
file
文件和 folder
文件夹结构体都实现了 print
打印和 clone
方法, 因为它们都是 inode
类型。 同时, 注意 file
和 folder
中的 clone
方法。 这两者的 clone
方法都会返回相应文件或文件夹的副本。 同时在克隆过程中, 我们会在其名称后面添加 “_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: 执行结果
Printing hierarchy for Folder2 Folder2 Folder1 File1 File2 File3 Printing hierarchy for clone Folder Folder2_clone Folder1_clone File1_clone File2_clone File3_clone