Skip to content
← 返回设计模式列表
设计意图与对象责任

原型 ​

复制已有对象作为新对象的起点。

创建型

说明 ​

复制后要明确深浅拷贝:切片和映射需额外复制,避免共享可变数据。

分析 ​

原型从已有对象复制出一个起点,适合初始化信息较多而只需改变少数字段的情况。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)
}

继续阅读