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
相关文章
|
2月前
|
Cloud Native Go 开发工具
不改一行代码轻松玩转 Go 应用微服务治理
为了更好的进行 Go 应用微服务治理,提高研发效率和系统稳定性,本文将介绍 MSE 微服务治理方案,无需修改业务代码,实现治理能力。
19764 7
|
2月前
|
缓存 NoSQL Go
通过 SingleFlight 模式学习 Go 并发编程
通过 SingleFlight 模式学习 Go 并发编程
|
6天前
|
JSON Go API
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
|
2月前
|
缓存 NoSQL 数据库
go-zero微服务实战系列(五、缓存代码怎么写)
go-zero微服务实战系列(五、缓存代码怎么写)
|
2月前
|
存储 Unix 测试技术
解释Go中常见的I/O模式
解释Go中常见的I/O模式
|
2月前
|
程序员 测试技术 Go
用 Go 编写简洁代码的最佳实践
用 Go 编写简洁代码的最佳实践
|
2月前
|
Java 数据库连接 数据库
携手前行:在Java世界中深入挖掘Hibernate与JPA的协同效应
【8月更文挑战第31天】Java持久化API(JPA)是一种Java规范,为数据库数据持久化提供对象关系映射(ORM)方法。JPA定义了实体类与数据库表的映射及数据查询和事务控制方式,确保不同实现间的兼容性。Hibernate是JPA规范的一种实现,提供了二级缓存、延迟加载等丰富特性,提升应用性能和可维护性。通过结合JPA和Hibernate,开发者能编写符合规范且具有高度可移植性的代码,并利用Hibernate的额外功能优化数据持久化操作。
34 0
|
2月前
|
JSON 数据库连接 Go
10个令人惊叹的Go语言技巧,让你的代码更加优雅
10个令人惊叹的Go语言技巧,让你的代码更加优雅
|
2月前
|
Go C语言
Go语言:新时代的编程英雄,让你的代码驾驭未来!
【8月更文挑战第29天】Go,或称Golang,是由谷歌开发的一种静态强类型的编译语言,旨在融合C语言的高效性和高级语言的易用性。它简洁、优雅,广泛应用于高性能服务器和网络应用开发。本文将通过环境搭建、Hello World示例、变量、常量、控制结构、函数、结构体、接口及错误处理等示例,带你快速入门Go语言,领略其简洁高效的魅力,激发你的编程热情。
36 0
|
2月前
|
API Docker 容器
容器镜像解析问题之使用go-containerregistry在代码中解析容器镜像如何解决
容器镜像解析问题之使用go-containerregistry在代码中解析容器镜像如何解决
23 0