Golang設(shè)計(jì)模式之工廠方法模式講解和代碼示例
Go 工廠方法模式講解和代碼示例
概念示例
由于 Go 中缺少類和繼承等 OOP 特性, 所以無(wú)法使用 Go 來(lái)實(shí)現(xiàn)經(jīng)典的工廠方法模式。 不過(guò), 我們?nèi)匀荒軐?shí)現(xiàn)模式的基礎(chǔ)版本, 即簡(jiǎn)單工廠。
在本例中, 我們將使用工廠結(jié)構(gòu)體來(lái)構(gòu)建多種類型的武器。
首先, 我們來(lái)創(chuàng)建一個(gè)名為 iGun的接口, 其中將定義一支槍所需具備的所有方法。 然后是實(shí)現(xiàn)了 iGun 接口的 gun槍支結(jié)構(gòu)體類型。 兩種具體的槍支——ak47與 musket火槍 ——兩者都嵌入了槍支結(jié)構(gòu)體, 且間接實(shí)現(xiàn)了所有的 iGun方法。
gunFactory槍支工廠結(jié)構(gòu)體將發(fā)揮工廠的作用, 即通過(guò)傳入?yún)?shù)構(gòu)建所需類型的槍支。 main.go 則扮演著客戶端的角色。 其不會(huì)直接與 ak47或 musket進(jìn)行互動(dòng), 而是依靠 gunFactory來(lái)創(chuàng)建多種槍支的實(shí)例, 僅使用字符參數(shù)來(lái)控制生產(chǎn)。
iGun.go: 產(chǎn)品接口
package main
type iGun interface {
setName(name string)
setPower(power string)
getName() string
getPower() string
}gun.go: 具體產(chǎn)品
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: 具體產(chǎn)品
package main
type Ak47 struct {
Gun
}
func newAk47() iGun {
return &Ak47{
Gun: Gun{
name: "AK47 gun",
power: 4,
},
}
}musket.go: 具體產(chǎn)品
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()
}到此這篇關(guān)于Golang設(shè)計(jì)模式之工廠方法模式講解和代碼示例的文章就介紹到這了,更多相關(guān)Golang 工廠方法模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang?gorm錯(cuò)誤處理事務(wù)以及日志用法示例
這篇文章主要為大家介紹了golang?gorm錯(cuò)誤處理事務(wù)以及日志用法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
golang方法中receiver為指針與不為指針的區(qū)別詳析
Go select 死鎖的一個(gè)細(xì)節(jié)
go?zero微服務(wù)實(shí)戰(zhàn)系服務(wù)拆分
Go語(yǔ)言通過(guò)Luhn算法驗(yàn)證信用卡卡號(hào)是否有效的方法

