概念
原型模式(prototype), 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式其实就是从一个对象再创建另一个可定制的对象(深拷贝), 新对象使用者不知道任何创建的细节。
具体实现:
- 创建一个结构体, 结构体封装一个深copy方法, 返回一个新的对象(这个时候数据没变,原来的结构体变量地址变了)。
模式的场景和优缺点
使用场景
一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用
优点
1、性能提高
2、逃避构造函数的约束
缺点
配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候
代码实现
package main
import "fmt"
// Example 示例结构体
type Example struct {
Content string
}
// Clone ...
func (e *Example) Clone() *Example {
// golang 深拷贝, 拷贝数据, 创建一个新的对象, 申请了新的内存, 内存不同。 浅拷贝, 直接复制指向对象的指针, 新老对象的指向的地址一样。
res := *e
return &res
}
func main() {
var e *Example
var eClone *Example
e = &Example{
Content: "Example",
}
fmt.Printf("e:%p,Content:%s\n", e, e.Content)
eClone = e.Clone()
fmt.Printf("clone e:%p,Content:%s\n", eClone, eClone.Content)
}