在Golang中您应该知道的原型模式(设计模式04)

Go中的优雅对象克隆:解释原型模式

联系作者@:微信公众号,Medium,LinkedIn,Twitter
golang golang-prototype-pattern(from github.com/MariaLetta/free-gophers-pack)|300

原型模式也是一种创建型模式,它可以帮助我们优雅地创建对象的拷贝。在这种设计模式里面,将克隆某个对象的职责交给了要被克隆的这个对象。在 Go 中,原型模式可以通过实现 Clone 方法来复制对象。

适用场景

  • 对象创建成本高
    1. 创建新对象的操作比较耗资源(如数据库操作)或代价比较高时。比较起从头创建新对象,克隆对象明显更加可取。
    2. 比如对象克隆的过程中存在深度拷贝或分层拷贝时;又比如要被克隆的对象存在无法被直接访问到的私有成员时。
  • 动态创建对象:对象类型在运行时动态决定。可以通过克隆操作来生成所需类型的对象,而不需要在编译时确定具体类型。

关键要素

  • 原型接口(Prototype):定义了克隆方法的接口,通常包含一个 Clone() 方法用于复制自身。
  • 具体原型(Concrete Prototype):实现了原型接口的具体类,具备复制自身的能力。
  • 克隆实验室(CloneLab):用于管理和存储原型实例,以便进行克隆。

Go语言中的原型模式实现

代码实现

假设我们正在开发一个简单的动物克隆实验室,可以克隆不同的动物,每种动物都实现了 Clone() 接口。

1. 定义接口和具体类型

2. 创建克隆实验室及示例

1
2
3
4
5
// output
Original Sheep: Name=Dolly, Weight=10, Info:[age: 1 gender: female]
Cloned Sheep: Name=Dolly, Weight=12, Info:[age: 1 gender: female]
Original Cow: Name=Bessie, Gender=female, Info:[age: 5 weight: 150]
Cloned Cow: Name=Bessie, Gender=female, Info:[age: 6 weight: 150]

众所周知,Golang中只有值拷贝,对于指针的指向内容,需要深度拷贝,而不是仅拷贝指针的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func (c *Cow) Clone() Cloneable {
newCow := &Cow{Name: c.Name, Gender: c.Gender}
if c.Info == nil {
return newCow
}
newCow.Info = make([]string, len(c.Info))
copy(newCow.Info, c.Info)
return newCow
}

// wrong case
func (c *Cow) Clone() Cloneable {
newCow := *c
return &newCow
}

而深拷贝无非有以下几种实现方式:

  1. 手动进行深度拷贝
  2. 序列化和反序列化
  3. 使用一些开箱即用的深拷贝的库

总结

  1. 原型模式在 Go 中可以通过接口和深拷贝逻辑可以轻松实现。
  2. 通过克隆现有对象来创建新对象,提供了一种灵活且高效的对象创建方式。它在需要创建大量相似对象的场景下非常有用,能够提升系统的性能和开发效率。
  3. 通过实现 Clone() 方法,各种具体类型可以轻松地生成其自身的副本,从而简化了对象管理和创建过程。

更多内容

最近文章:

随机文章:


更多该系列文章,参考medium链接:

https://wesley-wei.medium.com/list/you-should-know-in-golang-e9491363cd9a

English post: https://programmerscareer.com/golang-prototype-pattern/
作者:微信公众号,Medium,LinkedIn,Twitter
发表日期:原文在 2024-11-24 20:37 时创作于 https://programmerscareer.com/zh-cn/golang-prototype-pattern/
版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证

在Golang中您应该知道的对象池模式(设计模式05) 在Golang中您应该知道的单例模式(设计模式03)

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×