大话设计模式 Golang 版 - 原型模式

原文链接:大话设计模式 Golang 版 - 原型模式

关于

大话设计模式 Golang 版 是将 <<大话设计模式【Java溢彩加强版】(作者:程杰)>> 里面的 Java 代码用 Golang 重新写了一遍, 然后结合 图说设计模式 做总结归纳

这篇文章主要参考了:【Go实现】实践GoF的23种设计模式: 原型模式

简述

定义: 原型模式(Prototype),用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。

最简单直接的对象复制方式是这样的:重新实例化一个该对象的实例,然后遍历原始对象的所有成员变量, 并将成员变量值复制到新实例中。但这种方式的缺点也很明显:

  1. 客户端程序必须清楚对象的实现细节。暴露细节往往不是件好事,它会导致代码耦合过深。
  2. 对象可能存在一些私有属性,客户端程序无法访问它们,也就无法复制。
  3. 很难保证所有的客户端程序都能完整不漏地把所有成员属性复制完。

更好的方法是使用原型模式,将复制逻辑委托给对象本身,这样,上述两个问题也都解决了。

UML 结构

下面的 UML 图是原书中使用 Java 的 UML 图, 由于 Golang 中没有抽象类, 所以在代码实现时需要将 Java 中的抽象类转换为接口来实现

在这里插入图片描述

代码实现

源码下载地址: github.com/chapter09/

浅拷贝和深拷贝
如果原型对象的成员属性包含了指针类型,那么就会存在浅拷贝深拷贝两种复制方式。
比如示例代码中的 work *workExperience 就是指针类型,浅拷贝的做法是直接复制指针,深拷贝的做法则是创建新的 workExperience 对象。
另外,深拷贝要深入到多少层,需要事先就考虑好,而且需要当心出现循环引用的问题,需要小心处理

type Resume struct {
	name string
	sex  string
	age  string
	work *workExperience
}

这里的Clone() 方法就是用的深拷贝

func (w *workExperience) Clone() cloneable {
	newWorkExperience := *w
	return &newWorkExperience
}

典型应用场景

在以下情况下可以使用工厂方法模式:

  • 不管是复杂还是简单的对象,只要存在对象复制的场景,都适合使用原型模式。

优缺点

优点

  • 对客户端隐藏实现细节,有利于避免代码耦合。
  • 让客户端代码更简洁,有利于提升可读性。
  • 可方便地复制复杂对象,有利于杜绝客户端复制对象时的低级错误,比如漏复制属性。

缺点

  • 某些业务场景需要警惕浅拷贝问题。

参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值