Go设计模式之原型模式讲解和代码示例

 更新时间:2023年07月19日 08:32:14   作者:demo007x  
原型是一种创建型设计模式,使你能够复制对象,甚至是复杂对象,而又无需使代码依赖它们所属的类,本文将通过代码示例示例给大家讲解一下Go 原型模式,感兴趣的小伙伴可以参考阅读

Go 原型模式讲解和代码示例

所有的原型类都必须有一个通用的接口, 使得即使在对象所属的具体类未知的情况下也能复制对象。 原型对象可以生成自身的完整副本, 因为相同类的对象可以相互访问对方的私有成员变量。

概念示例

让我们尝试通过基于操作系统文件系统的示例来理解原型模式。 操作系统的文件系统是递归的: 文件夹中包含文件和文件夹, 其中又包含文件和文件夹, 以此类推。

每个文件和文件夹都可用一个 inode接口来表示。 inode接口中同样也有 clone克隆功能。

file文件和 folder文件夹结构体都实现了 print打印和 clone方法, 因为它们都是 inode类型。 同时, 注意 filefolder中的 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: 执行结果

Print hierarchy for folder2
 folder2
  folder1
    file1
  file2
  file3

Printing hierarchy for clone Folder
  folder2_clone
    folder1_clone
        file1_clone
    file2_clone
    file3_clone

到此这篇关于Go设计模式之原型模式讲解和代码示例的文章就介绍到这了,更多相关Go 原型模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang使用泛型结构体实现封装切片

    golang使用泛型结构体实现封装切片

    这篇文章主要为大家详细介绍了golang使用泛型结构体实现封装切片,即封装切片的增、删、改、查、长度大小、ForEach(遍历切片),感兴趣的小伙伴可以学习一下
    2023-10-10
  • golang读取文件的常用方法总结

    golang读取文件的常用方法总结

    今天小编就为大家分享一篇关于golang读取文件的常用方法总结,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • 使用 pprof 进行性能分析的方法详解

    使用 pprof 进行性能分析的方法详解

    pprof 是 Go 语言中用于性能分析的一个强大工具,它可以帮助开发人员找到应用程序中的性能瓶颈,并提供详细的分析报告,本文将介绍如何使用 pprof 进行性能分析,需要的朋友可以参考下
    2023-05-05
  • Go语言sync.Pool对象池使用场景基本示例

    Go语言sync.Pool对象池使用场景基本示例

    这篇文章主要为大家介绍了Go语言sync.Pool对象池使用场景的基本示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Go每日一库之zap日志库的安装使用指南

    Go每日一库之zap日志库的安装使用指南

    这篇文章主要为大家介绍了Go每日一库之zap安装使用示例学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • goland中导包报红和go mod问题

    goland中导包报红和go mod问题

    这篇文章主要介绍了goland中导包报红和go mod问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 详解Golang如何监听某个函数的开始执行和执行结束

    详解Golang如何监听某个函数的开始执行和执行结束

    这篇文章主要为大家详细介绍了Golang如何监听某个函数的开始执行和执行结束,文中的示例代码讲解详细,有需要的小伙伴可以参考一下
    2024-02-02
  • GO语言zap日志库理解和使用方法示例

    GO语言zap日志库理解和使用方法示例

    Zap是一个高性能、结构化日志库,专为Go语言设计,它由Uber开源,并且在Go社区中非常受欢迎,这篇文章主要介绍了GO语言zap日志库理解和使用方法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-11-11
  • Go语言在Linux环境下输出彩色字符的方法

    Go语言在Linux环境下输出彩色字符的方法

    这篇文章主要介绍了Go语言在Linux环境下输出彩色字符的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04
  • goland Duration 和time的区别说明

    goland Duration 和time的区别说明

    这篇文章主要介绍了goland Duration 和time的区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12

最新评论