前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go实现工厂模式

Go实现工厂模式

作者头像
Mandy的名字被占用了
发布2022-11-21 21:20:37
4220
发布2022-11-21 21:20:37
举报

工厂模式是什么

工厂方法模式是一种创建型设计模式,其在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型。

案例:比如当前需要实现一个多云平台的文件上传,以适配不同场景下的文件上传功能。

不使用设计模式的情况。

  1. 使用阿里云OSS时,创建一个阿里云的OSS方法。需要上传文件的地方直接调用该方法。使用腾讯云OSS、七牛云的OSS也分别创建类似的方法,用来实现文件上传功能。
  2. 前期使用的阿里云,我们直接调用阿里云;如果后期换做是腾讯云OSS,此时将对应的调用地方改为腾讯云的OSS处理方法...。

这样有什么问题呢?

代码耦合度高、灵活度低。我们换一种存储方式,就需要改动所有的调用者。

使用工厂设计模式。

使用工厂模式可以通过封装一个独立的方法,根据不同的存储方式去调用不同的OSS方法。这样对于整个代码的改动性更低。

由于不同的云存储,可能存在不同的方法。为了方便调用方,更加方便、统一的去调用不同的存储方法,这里在底层封装一个interface,每一个云存储方法实现该interface。这样不管是什么存储平台,我们调用的方法都是一致。

示例代码

  1. 创建一个interface,封装底层所有的实现方法。
代码语言:javascript
复制
type IGun interface {
 setName(name string)
 setPower(power int)
 getName() string
 getPower() int
}
  1. 每一个结构体实现该interface。考虑到每一个结构体都实现这些方法,我们单独封装一个公共的结构体,其他的结构体来实现该结构体,减少代码量(类似继承的作用)。
代码语言:javascript
复制
type Gun struct {
 name  string
 power int
}

func (g *Gun) setName(name string) {
 g.name = name
}

func (g *Gun) setPower(power int) {
 g.power = power
}

func (g *Gun) getName() string {
 return g.name
}

func (g *Gun) getPower() int {
 return g.power
}
  1. 定义具体的结构体,也就是独立的云存储方法。
代码语言:javascript
复制
// Ak47 定义一个实体结构体(用来处理实际的任务)
type ak47 struct {
 Gun
}

// newAk47Instance 定义一个函数,暴露出Musket实例
func newAk47Instance(name string, power int) IGun {
 return &musket{
  Gun{name: name, power: power},
 }
}

// Musket 定义一个实体结构体(用来处理实际的任务)
type musket struct {
 Gun
}

// newMusketInstance 定义一个函数,暴露出Musket实例
func newMusketInstance(name string, power int) IGun {
 return &musket{
  Gun{name: name, power: power},
 }
}
  1. 创建一个工厂结构体,根据客户端的调用方式来实例具体的云存储方法。
代码语言:javascript
复制
func getStruct(structName string) (IGun, error) {
 if structName == "ak47" {
  return &ak47{}, nil
 }
 if structName == "musket" {
  return &musket{}, nil
 }
 return nil, errors.New("参数传递错误")
}
  1. 客户端调用不同的存储方式。
代码语言:javascript
复制
func main() {
 getAk()
 fmt.Println("======================")
 getMusket()
}

func getAk() {
 akStruct, err := getStruct("ak47")
 if err != nil {
  fmt.Println("获取ak结构体失败", err)
  return
 }
 akStruct.setName("我是ak47")
 akStruct.setPower(1)
 fmt.Printf("%s我的动力是%d\n", akStruct.getName(), akStruct.getPower())
}

func getMusket() {
 akStruct, err := getStruct("musket")
 if err != nil {
  fmt.Println("获取ak结构体失败", err)
  return
 }
 akStruct.setName("我是musket")
 akStruct.setPower(2)
 fmt.Printf("%s我的动力是%d\n", akStruct.getName(), akStruct.getPower())
}
  1. 打印结果
代码语言:javascript
复制
我是ak47我的动力是1
======================
我是musket我的动力是2
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-10-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 卡二条的技术圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档