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

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

01概念示例

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

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

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

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


iGun.go: 产品接口

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


gun.go: 具体产品

package main
type gun struct {
    name  string
    power int
}
func (g *gun) setName(name string) {
    g.name = name
}
func (g *gun) getName() string {
    return g.name
}
func (g *gun) setPower(power int) {
    g.power = power
}
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) {
    if gunType == "ak47" {
        return newAk47(), nil
    }
    if gunType == "musket" {
        return newMusket(), nil
    }
    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()
}


output.txt: 执行结果

Gun: AK47 gun
Power: 4
Gun: Musket gun
Power: 1
相关文章
|
6天前
|
前端开发 Go
Golang深入浅出之-Go语言中的异步编程与Future/Promise模式
【5月更文挑战第3天】Go语言通过goroutines和channels实现异步编程,虽无内置Future/Promise,但可借助其特性模拟。本文探讨了如何使用channel实现Future模式,提供了异步获取URL内容长度的示例,并警示了Channel泄漏、错误处理和并发控制等常见问题。为避免这些问题,建议显式关闭channel、使用context.Context、并发控制机制及有效传播错误。理解并应用这些技巧能提升Go语言异步编程的效率和健壮性。
30 5
Golang深入浅出之-Go语言中的异步编程与Future/Promise模式
|
6天前
|
设计模式 Go 调度
Golang深入浅出之-Go语言中的并发模式:Pipeline、Worker Pool等
【5月更文挑战第1天】Go语言并发模拟能力强大,Pipeline和Worker Pool是常用设计模式。Pipeline通过多阶段处理实现高效并行,常见问题包括数据竞争和死锁,可借助通道和`select`避免。Worker Pool控制并发数,防止资源消耗,需注意任务分配不均和goroutine泄露,使用缓冲通道和`sync.WaitGroup`解决。理解和实践这些模式是提升Go并发性能的关键。
31 2
|
6天前
|
Go 微服务
4. 参考 go 代码——服务注册与发现
4. 参考 go 代码——服务注册与发现
|
6天前
|
编解码 JavaScript 前端开发
【专栏】介绍了字符串Base64编解码的基本原理和在Java、Python、C++、JavaScript及Go等编程语言中的实现示例
【4月更文挑战第29天】本文介绍了字符串Base64编解码的基本原理和在Java、Python、C++、JavaScript及Go等编程语言中的实现示例。Base64编码将24位二进制数据转换为32位可打印字符,用“=”作填充。文中展示了各语言的编码解码代码,帮助开发者理解并应用于实际项目。
|
6天前
|
设计模式 测试技术 Go
[设计模式 Go实现] 创建型~工厂方法模式
[设计模式 Go实现] 创建型~工厂方法模式
|
6天前
|
设计模式 测试技术 Go
[设计模式 Go实现] 创建型~简单工厂模式
[设计模式 Go实现] 创建型~简单工厂模式
|
6天前
|
存储 Go 开发者
Golang深入浅出之-Go语言字符串操作:常见函数与面试示例
【4月更文挑战第20天】Go语言字符串是不可变的字节序列,采用UTF-8编码。本文介绍了字符串基础,如拼接(`+`或`fmt.Sprintf()`)、长度与索引、切片、查找与替换(`strings`包)以及转换与修剪。常见问题包括字符串不可变性、UTF-8编码处理、切片与容量以及查找与替换的边界条件。通过理解和实践这些函数及注意事项,能提升Go语言编程能力。
28 0
|
6天前
|
Go 索引
掌握Go语言:Go语言范围,优雅遍历数据结构,简化代码操作实战解析(24)
掌握Go语言:Go语言范围,优雅遍历数据结构,简化代码操作实战解析(24)
|
6天前
|
存储 Go 索引
掌握Go语言:深入理解Go语言数组,基本原理与示例解析(15)
掌握Go语言:深入理解Go语言数组,基本原理与示例解析(15)
|
6天前
|
安全 编译器 Serverless
掌握Go语言:深入Go语言常量:代码稳定的关键(10)
掌握Go语言:深入Go语言常量:代码稳定的关键(10)