golang设计模式之原型模式

栏目: Go · 发布时间: 6年前

内容简介:wiki:原型模式是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的“原型”,这个原型是可定制的。原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据。这是一个十分简单的设计模式,可以看做是其他语言中的克隆方法,例如而且原型模式很少单独使用,一般与其他对象结合使用。

wiki:原型模式是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的“原型”,这个原型是可定制的。原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据。

这是一个十分简单的设计模式,可以看做是其他语言中的克隆方法,例如 JAVA / PHP 中都有相关方法,从一个内存中已经存在的对象中,拷贝出一个一模一样的对象来,针对复杂对象或比较大的对象,要比使用各种设计模式 new 出来的对象要快的多,

而且原型模式很少单独使用,一般与其他对象结合使用。

栗子

  1. 创建一个结构体

    // 示例结构体
      type Example struct {
      	Content string
      }
    复制代码
  2. 添加克隆方法

    func (e *Example) Clone() *Example {
      	res := *e
      	return &res
      }
    复制代码

    我们仅仅一行代码就完成了值的拷贝,使用 *指针 ,直接获取了一个拷贝的值,然后将这个拷贝的值得指针返回,原理请阅读下面的扩展阅读。

  3. 编写主代码

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 ~


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

逆向工程核心原理

逆向工程核心原理

[韩] 李承远 / 武传海 / 人民邮电出版社 / 2014-4-25 / 109.00元

本书十分详尽地介绍了代码逆向分析的核心原理。作者在Ahnlab 研究所工作多年,书中不仅包括其以此经验为基础亲自编写的大量代码,还包含了逆向工程研究人员必须了解的各种技术和技巧。彻底理解并切实掌握逆向工程这门技术,就能在众多IT 相关领域进行拓展运用,这本书就是通向逆向工程大门的捷径。 想成为逆向工程研究员的读者或正在从事逆向开发工作的开发人员一定会通过本书获得很大帮助。同时,想成为安全领域......一起来看看 《逆向工程核心原理》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

html转js在线工具
html转js在线工具

html转js在线工具