原型
复制已有对象作为新对象的起点。
创建型
说明
复制后要明确深浅拷贝:切片和映射需额外复制,避免共享可变数据。
分析
原型从已有对象复制出一个起点,适合初始化信息较多而只需改变少数字段的情况。Go 的结构体赋值只会浅拷贝切片、映射和指针,因此示例显式复制 Tags。
结构体赋值复制切片描述符,不会复制底层元素。Clone 为 Tags 分配新底层数组后,修改克隆体第一项才不会污染原对象。这个示例是字符串切片;若元素变成指针,新数组仍共享被指向对象,需要按所有权继续复制,不能把复制一层称为任意对象图的深拷贝。
查看图表代码
适用前提与边界
若遗漏这一层,修改克隆体的标签也会影响原对象。 创建过程没有复用或选择需求时,直接构造通常更清楚。
示例输入与调用
go
original := Document{Title: "Draft", Tags: []string{"go"}}
clone := original.Clone()
clone.Tags[0] = "patterns"
fmt.Println(original.Tags, clone.Tags)运行输出
text
[go] [patterns]完整 Go 示例
go
package main
import "fmt"
type Document struct {
Title string
Tags []string
}
func (d Document) Clone() Document {
d.Tags = append([]string(nil), d.Tags...)
return d
}
func main() {
original := Document{Title: "Draft", Tags: []string{"go"}}
clone := original.Clone()
clone.Tags[0] = "patterns"
fmt.Println(original.Tags, clone.Tags)
}继续阅读
- 设计意图与对象责任
- 设计意图与对象责任
- 设计意图与对象责任