原型模式是创建型模式中的最后一个,它主要用于对象创建成本比较大的情况。
本文UML类图链接为:https://www.processon.com/view/link/6080def6079129456d4beecf
本文代码链接为:https://github.com/shidawuhen/asap/blob/master/controller/design/10prototype.go
1.定义
1.1原型模式
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
UML类图:
1.2分析
UML图里的Client是客户端,可以不用管。对于Prototype,核心在于对象自身的Clone函数,用于拷贝自己。所以对于原型模式主要关注Clone函数即可,Clone可实现深拷贝或者浅拷贝。
至于是否需要有Prototype接口类,看具体情况,如果需要用到里氏替换,就创建接口类,如果没有用处,就无需创建。
2.使用场景
原型模式主要用于创建对象成本较大的情况。如果创建对象极其方便,就不要用原型模式了,否则有过度设计、得不偿失之嫌。
一般使用在建立对象特别耗费资源,如需要从DB、硬盘等获取大量数据或者需要经过大量计算等;又或者建立的对象存储的内容是可以被复用,完全重新建一个新的更加耗时。
使用原型模式,需要了解深拷贝和浅拷贝。浅拷贝是指被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。深拷贝把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。在项目中使用深拷贝和还是浅拷贝,需要具体问题具体分析。
前些日子找工作的时候,使用了一款叫超级简历的APP,感觉挺符合原型模式的。编辑好一份简历后,可以生成副本,两份简历更改互不影响。因为对于不同的公司,简历表达侧重点不一样,但简历中很多内容都是可以复用的,所以副本这种操作很实用。
3.代码实现
1 | package main |
输出为:
➜ myproject go run main.go
—————————原简历
我的名字是王工作,性别男,今年10岁,在光明顶无限责任公司工作,工作经验为:学武功和划水、摸鱼
—————————简历特别好,抄
我的名字是李工作,性别男,今年21岁,在光明顶无限责任公司工作,工作经验为:学武功和划水、摸鱼
总结
原型模式就是利用对已有对象(原型)进行复制(或者叫拷贝)的方式,来创建新对象,以达到节省创建时间的目的。拷贝可以选择深拷贝或者浅拷贝。