Go 工厂办法形式讲解和代码示例

工厂办法是一种创立型规划形式, 处理了在不指定详细类的情况下创立产品目标的问题。

工厂办法定义了一个办法, 且有必要运用该办法代替经过直接调用结构函数来创立目标 ( new操作符) 的方式。 子类可重写该办法来更改将被创立的目标所属类。

概念示例

因为 Go 中缺少类和承继等 OOP 特性, 所以无法运用 Go 来实现经典的工厂办法形式。 不过, 咱们仍然能实现形式的基础版别, 即简略工厂。

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

首先, 咱们来创立一个名为 iGun接口, 其中将定义一支枪所需具有的一切办法。 然后是实现了 iGun 接口的 gun枪支结构体类型。 两种详细的枪支——ak47musket火枪 ——两者都嵌入了枪支结构体, 且间接实现了一切的 iGun办法。

gunFactory枪支工厂结构体将发挥工厂的作用, 即经过传入参数构建所需类型的枪支。 main.go 则扮演着客户端的角色。 其不会直接与 ak47musket进行互动, 而是依托 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()
}

output.txt: 履行结果