Golang设计模式之工厂方法模式讲解和代码示例

 更新时间:2023年06月27日 08:56:27   作者:demo007x  
工厂方法是一种创建型设计模式, 解决了在不指定具体类的情况下创建产品对象的问题,本文将通过代码示例详细给大家介绍一下Golang工厂方法模式,感兴趣的同学可以参考一下

Go 工厂方法模式讲解和代码示例

概念示例

由于 Go 中缺少类和继承等 OOP 特性, 所以无法使用 Go 来实现经典的工厂方法模式。 不过, 我们仍然能实现模式的基础版本, 即简单工厂。

在本例中, 我们将使用工厂结构体来构建多种类型的武器。

首先, 我们来创建一个名为 iGun的接口, 其中将定义一支枪所需具备的所有方法。 然后是实现了 iGun 接口的 gun枪支结构体类型。 两种具体的枪支——ak47musket火枪 ——两者都嵌入了枪支结构体, 且间接实现了所有的 i­Gun方法。

gun­Factory枪支工厂结构体将发挥工厂的作用, 即通过传入参数构建所需类型的枪支。 main.go 则扮演着客户端的角色。 其不会直接与 ak47musket进行互动, 而是依靠 gun­Factory来创建多种枪支的实例, 仅使用字符参数来控制生产。

iGun.go: 产品接口

package main
type iGun interface {
	setName(name string)
	setPower(power string)
	getName() string
	getPower() string
}

gun.go: 具体产品

package main
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
}

ak47.go: 具体产品

package main
type Ak47 struct {
	Gun
}
func newAk47() iGun {
	return &Ak47{
		Gun: Gun{
			name:  "AK47 gun",
			power: 4,
		},
	}
}

musket.go: 具体产品

package main
type musket struct {
	Gun
}
func newMusket() iGun {
	return &musket{
		Gun: Gun{
			name:  "Musket gun",
			power: 1,
		},
	}
}

gunFactory.go: 工厂

package main
import "fmt"
func getGun(gunType string) (iGun, error) {
	switch gunType {
	case "ak47":
		return newAk47(), nil
	case "nusket":
		return newMusket(), nil
	default:
		return nil, fmt.Errorf("Wrong gun type passed")
	}
}

main.go: 客户端代码

package main
import "fmt"
func main() {
	ak47, _ := getGun("ak47")
	musket, _ := getGun("musket")
	printDetails(ak47)
	printDetails(musket)
}
func printDetails(g iGun) {
	fmt.Printf("Gun: %s", g.getName())
	fmt.Println()
	fmt.Printf("Power: %d", g.getPower())
	fmt.Println()
}

到此这篇关于Golang设计模式之工厂方法模式讲解和代码示例的文章就介绍到这了,更多相关Golang 工厂方法模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang gorm错误处理事务以及日志用法示例

    golang gorm错误处理事务以及日志用法示例

    这篇文章主要为大家介绍了golang gorm错误处理事务以及日志用法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • Go 为什么不支持可重入锁原理解析

    Go 为什么不支持可重入锁原理解析

    这篇文章主要为大家介绍了Go 为什么不支持可重入锁原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • golang遍历map的方法小结

    golang遍历map的方法小结

    在Go语言中,使用range关键字可以遍历map,返回键和值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-03-03
  • go新工具gonew生成模板工具链使用详解

    go新工具gonew生成模板工具链使用详解

    这篇文章主要为大家介绍了go新工具gonew生成模板工具链使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • golang中iota的用法小结

    golang中iota的用法小结

    iota是Go语言中的一个预定义标识符,用于表示const声明块中每个常量的偏移值,本文主要介绍了golang中iota的用法小结,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • golang方法中receiver为指针与不为指针的区别详析

    golang方法中receiver为指针与不为指针的区别详析

    这篇文章主要给大家介绍了关于golang方法中receiver为指针与不为指针区别的相关资料,其实最大的区别应该是指针传递的是对像的引用,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-10-10
  • Golang操作excel的技巧与方法

    Golang操作excel的技巧与方法

    在Golang中操作Excel可以包括读取、写入和编辑Excel文件,你可以定义函数或方法来执行这些操作,本文给大家介绍了Golang操作excel的技巧与方法,文中有详细的代码讲解,需要的朋友可以参考下
    2024-05-05
  • Go select 死锁的一个细节

    Go select 死锁的一个细节

    这篇文章主要给大家分享的是Go select 死锁的一个细节,文章先是对主题提出问题,然后展开内容,感兴趣的小伙伴可以借鉴一下,希望对你有所帮助
    2021-10-10
  • go zero微服务实战系服务拆分

    go zero微服务实战系服务拆分

    这篇文章主要为大家介绍了go zero微服务实战系服务拆分的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Go语言通过Luhn算法验证信用卡卡号是否有效的方法

    Go语言通过Luhn算法验证信用卡卡号是否有效的方法

    这篇文章主要介绍了Go语言通过Luhn算法验证信用卡卡号是否有效的方法,实例分析了Luhn算法的原理与验证卡号的使用技巧,需要的朋友可以参考下
    2015-03-03

最新评论