内容简介:wiki:原型模式是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的“原型”,这个原型是可定制的。原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据。这是一个十分简单的设计模式,可以看做是其他语言中的克隆方法,例如而且原型模式很少单独使用,一般与其他对象结合使用。
wiki:原型模式是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的“原型”,这个原型是可定制的。原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据。
这是一个十分简单的设计模式,可以看做是其他语言中的克隆方法,例如 JAVA
/ PHP
中都有相关方法,从一个内存中已经存在的对象中,拷贝出一个一模一样的对象来,针对复杂对象或比较大的对象,要比使用各种设计模式 new
出来的对象要快的多,
而且原型模式很少单独使用,一般与其他对象结合使用。
栗子
-
创建一个结构体
// 示例结构体 type Example struct { Content string } 复制代码 -
添加克隆方法
func (e *Example) Clone() *Example { res := *e return &res } 复制代码我们仅仅一行代码就完成了值的拷贝,使用
*指针,直接获取了一个拷贝的值,然后将这个拷贝的值得指针返回,原理请阅读下面的扩展阅读。 -
编写主代码
func main() {
r1 := new(Example)
r1.Content = "this is example 1"
r2 := r1.Clone()
r2.Content = "this is example 2"
fmt.Println(r1)
fmt.Println(r2)
}
复制代码
扩展阅读: 深拷贝与浅拷贝
go
语言中的传递都是值传递,传递一个对象,就会把对象拷贝一份传入函数中,传递一个指针,就会把指针拷贝一份传入进去。
赋值的时候也是这样, res:=*e
就会把传递的 Example
对象拷贝一份,如果是 res:=e
的话,那么拷贝的就是对象的指针了.
而深拷贝和浅拷贝也可以这样理解,深拷贝就是拷贝整个对象,浅拷贝就是拷贝对象指针。
对于深度拷贝, go
和其他语言还经常使用序列化后反序列化的形式进行拷贝:
func deepCopy(dst, src interface{}) error {
var buf bytes.Buffer
if err := gob.NewEncoder(&buf).Encode(src); err != nil {
return err
}
return gob.NewDecoder(bytes.NewBuffer(buf.Bytes())).Decode(dst)
}
复制代码
实际上 gob
包序列化的时候也是用到了 reflect
包来实现拷贝的
注意:golang完全是按值传递,所以如果深度拷贝的对象中包含有指针的话,那么深度拷贝后,这些指针也会相同,会导致部分数据共享,要注意这一点.
至此,所有创建型的 设计模式 就已经全部写完了,可以去下面的仓库中找到其他的设计模式喔....
上述代码均放在 golang-design-patterns 这个仓库中
打个广告,推荐一下自己写的 go web框架 bingo ,求star,求PR ~
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Google's PageRank and Beyond
Amy N. Langville、Carl D. Meyer / Princeton University Press / 2006-7-23 / USD 57.50
Why doesn't your home page appear on the first page of search results, even when you query your own name? How do other web pages always appear at the top? What creates these powerful rankings? And how......一起来看看 《Google's PageRank and Beyond》 这本书的介绍吧!