Go 工厂办法形式讲解和代码示例
工厂办法是一种创立型规划形式, 处理了在不指定详细类的情况下创立产品目标的问题。
工厂办法定义了一个办法, 且有必要运用该办法代替经过直接调用结构函数来创立目标 ( new
操作符) 的方式。 子类可重写该办法来更改将被创立的目标所属类。
概念示例
因为 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()
}