原型模式

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

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

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

栗子

  1. 创建一个结构体

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

      func (e *Example) Clone() *Example {res := *ereturn &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.Bufferif 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 ~

golang设计模式之原型模式相关推荐

  1. 【GOF23设计模式】原型模式

    [GOF23设计模式]原型模式 来源:http://www.bjsxt.com/  一.[GOF23设计模式]_原型模式.prototype.浅复制.深复制.Cloneable接口  浅复制 1 pa ...

  2. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

    [索引页] [源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:webabcd 介绍 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. ...

  3. 教你如何一篇博客读懂设计模式之—--原型模式

    教你如何一篇博客读懂设计模式之----原型模式 what:是什么 原型模式: 用于创建重复的对象,既不用一个属性一个属性去set和get,又不影响性能,原型模式产生的对象和原有的对象不是同一个实例,他 ...

  4. 二十三种设计模式之原型模式

    今天继续探讨GOF二十三种设计模式的原型模式,原型模式也是属于创建型模式的一种 原型模式通俗的讲就是对象复制的过程,即通过一个原型对象,我可以得到一个该对象的克隆. 下面来看下原型模式的第一种写法-- ...

  5. C#设计模式(6)——原型模式(Prototype Pattern)

    一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...

  6. 设计模式回顾——原型模式(C++)

    文章目录 1 前言 2 什么是原型模式 2.1 原型模式组成 2.2 原型模式UML图 2.3 原型模式作用 3 原型模式优缺点 4 什么地方使用原型模式 5 原型模式实现 6 原型模式与构造函数 1 ...

  7. 设计模式之 原型模式

    原型模式应用场景举例:  GG和MM经常在QQ上聊天,但是GG打字的速度慢如蜗牛爬行,每次MM在瞬间完成恢复或者问候是,GG都会很紧张的去尽力快速打字,尽管如此,还是让MM有些不高心,MM说回复信息这 ...

  8. 设计模式之原型模式(Prototype)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

  9. 【设计模式】原型模式 ( 概念简介 | 使用场景 | 优缺点 | 基本用法 )

    文章目录 I . 原型模式 概念简介 II . 原型模式 使用场景 III . 原型模式 优缺点 IV . 原型模式 实现及 简单示例 I . 原型模式 概念简介 原型模式 : 用原型实例指定创建对象 ...

最新文章

  1. struts2之配置文件struts.xml详解
  2. 一句话总结人工神经网络
  3. 单片机片外RAM,串行的
  4. 第 17 章 Native SQL查询
  5. 在Emacs中使用ECB(转载)
  6. es6 混合commjs_es6的模块化文件mjs为什么无法运行呢 | 学步园
  7. QCon上海2015热点前瞻:Uber伸缩之道、注重实效的性能
  8. Fgui: Glist 实现无限滑动 虚拟列表
  9. Microsoft Visual Studio 2012 旗舰版 镜像 ISO 官方下载地址 旗舰版 序列号 SN VS2012_ULT_chs.iso
  10. hdu4565 so easy 矩阵
  11. SSH、SSL、TSL
  12. android页指示动画,Android动画之翻页
  13. vue手写上一页下一页
  14. 1. 计算机思维 (大一新生,到)
  15. 十二个“一”的文艺创作拓展:关于星座
  16. ggplot2的自定义调色板
  17. SETCLIENTID
  18. python基础实例
  19. 全球与中国投影面料市场深度研究分析报告
  20. 四十三、文件传输协议FTP、电子邮件、万维网

热门文章

  1. Java重写equals和hashCode方法
  2. HwBinder驱动篇-Android10.0 HwBinder通信原理(十)
  3. java 字符串常用函数_Java学习(5)——字符串常用函数
  4. swift_021(Swift 的方法)
  5. 玩转VSCode插件之Remote-SSH
  6. C# — 通过点击回车执行任务
  7. Lintcode27-Reverse 3-digit Integer
  8. shell基础知识总结
  9. SpringMVC Controller介绍(转)
  10. oracle 分析函数1