[go] 原型模式

简介: [go] 原型模式

原型模式


原型模式是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类。


模型说明



  1. 原型(Prototype)接口将对克隆方法进行声明。在绝大多数情况下,其中只会有一个名为clone克隆的方法。


  1. 具体原型(Concrete Prototype)类将实现克隆方法。除了将原始对象的数据复制到克隆体中之外,该方法有时还需处理克隆过程中的极端情况,例如克隆关联对象和梳理递归依赖等等。


  1. 客户端(Client)可以复制实现了原型接口的任何对象。


优缺点


1.优点


  • 你可以克隆对象,而无需与它们所属的具体类相耦合。
  • 你可以克隆预生成原型,避免反复运行初始化代码。
  • 你可以更方便地生成复杂对象。
  • 你可以用继承以外的方式来处理复杂对象的不同配置。


2.缺点


  • 克隆包含循环引用的复杂对象可能会非常麻烦。


使用场景


  • 如果你需要复制一些对象,同时又希望代码独立于这些对象所属的具体类,可以使用原型模式。
  • 如果子类的区别仅在于其对象的初始化方式,那么你可以使用该模式来减少子类的数量。别人创建这些子类的目的可能是为了创建特定类型的对象。


参考代码


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


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:


Printing hierarchy for Folder2
  Folder2
    Folder1
        File1
    File2
    File3
Printing hierarchy for clone Folder
  Folder2_clone
    Folder1_clone
        File1_clone
    File2_clone
    File3_clone
相关文章
|
9月前
|
设计模式 测试技术 Go
[设计模式 Go实现] 创建型~ 原型模式
[设计模式 Go实现] 创建型~ 原型模式
Go 原型模式讲解和代码示例
Go 原型模式讲解和代码示例
94 0
|
设计模式 Go
Go的原型模式
原型模式(Prototype Pattern)是一种创建型设计模式,它允许我们通过复制现有对象来创建新对象,而无需依赖于显式的构造函数
77 0
|
设计模式 Go
Go实现设计模式之原型模式
原型模式(Prototype Pattern)是一种创建型设计模式,它通过复制现有对象来创建新对象,而无需通过实例化类来创建。原型模式可以在运行时动态创建对象,并且可以避免直接使用 `new` 关键字创建对象的复杂性。
247 0
|
设计模式 缓存 网络协议
Go设计模式(10)-原型模式
原型模式是创建型模式中的最后一个,它主要用于对象创建成本比较大的情况。
|
2月前
|
存储 监控 算法
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
95 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
|
2月前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
4天前
|
监控 Linux PHP
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
51 20
|
2天前
|
存储 监控 算法
探秘员工泄密行为防线:基于Go语言的布隆过滤器算法解析
在信息爆炸时代,员工泄密行为对企业构成重大威胁。本文聚焦布隆过滤器(Bloom Filter)这一高效数据结构,结合Go语言实现算法,帮助企业识别和预防泄密风险。通过构建正常操作“指纹库”,实时监测员工操作,快速筛查可疑行为。示例代码展示了如何利用布隆过滤器检测异常操作,并提出优化建议,如调整参数、结合日志分析系统等,全方位筑牢企业信息安全防线,守护核心竞争力。
|
10天前
|
Go C语言
Go语言入门:分支结构
本文介绍了Go语言中的条件语句,包括`if...else`、`if...else if`和`switch`结构,并通过多个练习详细解释了它们的用法。`if...else`用于简单的条件判断;`if...else if`处理多条件分支;`switch`则适用于基于不同值的选择逻辑。特别地,文章还介绍了`fallthrough`关键字,用于优化重复代码。通过实例如判断年龄、奇偶数、公交乘车及成绩等级等,帮助读者更好地理解和应用这些结构。
34 14

热门文章

最新文章