建造型设计模式-原型模式

原型模式:通过复制、拷贝或者叫克隆已有对象的方式来创建新对象的设计模式叫做原型模式,被拷贝的对象也被称作原型对象。

如果一个类的有非常多的属性,层级还很深。每次构造起来,不管是直接构造还是用建造者模式,都要对太多属性进行复制。

原型对象按照惯例,会暴露出一个 Clone 方法,给外部调用者一个机会来从自己这里“零成本”的克隆出一个新对象。

这里的“零成本”说的是,调用者啥都不用干,干等着,原型对象在 Clone 方法里自己克隆出自己,给到调用者,所以按照这个约定所有原型对象都要实现一个 Clone 方法。

package prototype

import (
 "encoding/json"
 "time"
)

// Keyword 搜索关键字
type Keyword struct {
 word      string
 visit     int
 UpdatedAt *time.Time
}

// Clone 这里使用序列化与反序列化的方式深拷贝
func (k *Keyword) Clone() *Keyword {
 var newKeyword Keyword
 b, _ := json.Marshal(k)
 json.Unmarshal(b, &newKeyword)
 return &newKeyword
}

// Keywords 关键字 map
type Keywords map[string]*Keyword

// Clone 复制一个新的 keywords
// updatedWords: 需要更新的关键词列表,由于从数据库中获取数据常常是数组的方式
func (words Keywords) Clone(updatedWords []*Keyword) Keywords {
 newKeywords := Keywords{}

 for k, v := range words {
  // 这里是浅拷贝,直接拷贝了地址
  newKeywords[k] = v
 }

 // 替换掉需要更新的字段,这里用的是深拷贝
 for _, word := range updatedWords {
  newKeywords[word.word] = word.Clone()
 }

 return newKeywords
}

使用原型模式的目的主要是为了节省创建对象所花费的时间和资源消耗,提升性能。
参考公众号网管叨bi叨

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值