目录
- Go 工厂方法模式讲解和代码示例
- 概念示例
- iGun.go: 产品接口
- gun.go: 具体产品
- ak47.go: 具体产品
- musket.go: 具体产品
- gunFactory.go: 工厂
- main.go: 客户端代码
Go 工厂方法模式讲解和代码示例
概念示例
由于 Go 中缺少类和继承等 OOP 特性, 所以无法使用 Go 来实现经典的工厂方法模式。 不过, 我们仍然能实现模式的基础版本, 即简单工厂。
在本例中, 我们将使用工厂结构体来构建多种类型的武器。
首先, 我们来创建一个名为 iGun的接口, 其中将定义一支枪所需具备的所有方法。 然后是实现了 iGun 接口的 gun枪支结构体类型。 两种具体的枪支——ak47与 musket火枪 ——两者都嵌入了枪支结构体, 且间接实现了所有的 iGun方法。
gunFactory枪支工厂结构体将发挥工厂的作用, 即通过传入参数构建所需类型的枪支。 main.go 则扮演着客户端的角色。 其不会直接与 ak47或 musket进行互动, 而是依靠 gunFactory来创建多种枪支的实例, 仅使用字符参数来控制生产。
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()
}
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

评论(0)