golang设计模式之原型模式
原型模式
wiki:原型模式是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的“原型”,这个原型是可定制的。原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据。
这是一个十分简单的设计模式,可以看做是其他语言中的克隆方法,例如 JAVA
/PHP
中都有相关方法,从一个内存中已经存在的对象中,拷贝出一个一模一样的对象来,针对复杂对象或比较大的对象,要比使用各种设计模式new
出来的对象要快的多,
而且原型模式很少单独使用,一般与其他对象结合使用。
栗子
创建一个结构体
// 示例结构体type Example struct {Content string} 复制代码
添加克隆方法
func (e *Example) Clone() *Example {res := *ereturn &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.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设计模式之原型模式相关推荐
- 【GOF23设计模式】原型模式
[GOF23设计模式]原型模式 来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_原型模式.prototype.浅复制.深复制.Cloneable接口 浅复制 1 pa ...
- 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)
[索引页] [源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:webabcd 介绍 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. ...
- 教你如何一篇博客读懂设计模式之—--原型模式
教你如何一篇博客读懂设计模式之----原型模式 what:是什么 原型模式: 用于创建重复的对象,既不用一个属性一个属性去set和get,又不影响性能,原型模式产生的对象和原有的对象不是同一个实例,他 ...
- 二十三种设计模式之原型模式
今天继续探讨GOF二十三种设计模式的原型模式,原型模式也是属于创建型模式的一种 原型模式通俗的讲就是对象复制的过程,即通过一个原型对象,我可以得到一个该对象的克隆. 下面来看下原型模式的第一种写法-- ...
- C#设计模式(6)——原型模式(Prototype Pattern)
一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...
- 设计模式回顾——原型模式(C++)
文章目录 1 前言 2 什么是原型模式 2.1 原型模式组成 2.2 原型模式UML图 2.3 原型模式作用 3 原型模式优缺点 4 什么地方使用原型模式 5 原型模式实现 6 原型模式与构造函数 1 ...
- 设计模式之 原型模式
原型模式应用场景举例: GG和MM经常在QQ上聊天,但是GG打字的速度慢如蜗牛爬行,每次MM在瞬间完成恢复或者问候是,GG都会很紧张的去尽力快速打字,尽管如此,还是让MM有些不高心,MM说回复信息这 ...
- 设计模式之原型模式(Prototype)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...
- 【设计模式】原型模式 ( 概念简介 | 使用场景 | 优缺点 | 基本用法 )
文章目录 I . 原型模式 概念简介 II . 原型模式 使用场景 III . 原型模式 优缺点 IV . 原型模式 实现及 简单示例 I . 原型模式 概念简介 原型模式 : 用原型实例指定创建对象 ...
最新文章
- struts2之配置文件struts.xml详解
- 一句话总结人工神经网络
- 单片机片外RAM,串行的
- 第 17 章 Native SQL查询
- 在Emacs中使用ECB(转载)
- es6 混合commjs_es6的模块化文件mjs为什么无法运行呢 | 学步园
- QCon上海2015热点前瞻:Uber伸缩之道、注重实效的性能
- Fgui: Glist 实现无限滑动 虚拟列表
- Microsoft Visual Studio 2012 旗舰版 镜像 ISO 官方下载地址 旗舰版 序列号 SN VS2012_ULT_chs.iso
- hdu4565 so easy 矩阵
- SSH、SSL、TSL
- android页指示动画,Android动画之翻页
- vue手写上一页下一页
- 1. 计算机思维 (大一新生,到)
- 十二个“一”的文艺创作拓展:关于星座
- ggplot2的自定义调色板
- SETCLIENTID
- python基础实例
- 全球与中国投影面料市场深度研究分析报告
- 四十三、文件传输协议FTP、电子邮件、万维网