Golang設(shè)計模式中抽象工廠模式詳細(xì)講解
抽象工廠模式
抽象工廠模式是一種創(chuàng)建型設(shè)計模式, 它能創(chuàng)建一系列相關(guān)的對象, 而無需指定其具體類。
抽象工廠定義了用于創(chuàng)建不同產(chǎn)品的接口, 但將實(shí)際的創(chuàng)建工作留給了具體工廠類。 每個工廠類型都對應(yīng)一個特定的產(chǎn)品變體。
在創(chuàng)建產(chǎn)品時, 客戶端代碼調(diào)用的是工廠對象的構(gòu)建方法, 而不是直接調(diào)用構(gòu)造函數(shù) (new操作符)。 由于一個工廠對應(yīng)一種產(chǎn)品變體, 因此它創(chuàng)建的所有產(chǎn)品都可相互兼容。
客戶端代碼僅通過其抽象接口與工廠和產(chǎn)品進(jìn)行交互。 該接口允許同一客戶端代碼與不同產(chǎn)品進(jìn)行交互。 你只需創(chuàng)建一個具體工廠類并將其傳遞給客戶端代碼即可。
概念示例
讓我們假設(shè)一下, 如果你想要購買一組運(yùn)動裝備, 比如一雙鞋與一件襯衫這樣由兩種不同產(chǎn)品組合而成的套裝。 相信你會想去購買同一品牌的商品, 這樣商品之間能夠互相搭配起來。
如果我們把這樣的行為轉(zhuǎn)換成代碼的話, 幫助我們創(chuàng)建此類產(chǎn)品組的工具就是抽象工廠, 便于產(chǎn)品之間能夠相互匹配。
iSportsFactory.go: 抽象工廠接口
package main import "fmt" type ISportsFactory interface { makeShoe() IShoe makeShirt() IShirt } func GetSportsFactory(brand string) (ISportsFactory, error) { if brand == "adidas" { return &Adidas{}, nil } if brand == "nike" { return &Nike{}, nil } return nil, fmt.Errorf("Wrong brand type passed") }
adidas.go: 具體工廠
package main type Adidas struct { } func (a *Adidas) makeShoe() IShoe { return &AdidasShoe{ Shoe: Shoe{ logo: "adidas", size: 14, }, } } func (a *Adidas) makeShirt() IShirt { return &AdidasShirt{ Shirt: Shirt{ logo: "adidas", size: 14, }, } }
nike.go: 具體工廠
package main type Nike struct { } func (n *Nike) makeShoe() IShoe { return &NikeShoe{ Shoe: Shoe{ logo: "nike", size: 14, }, } } func (n *Nike) makeShirt() IShirt { return &NikeShirt{ Shirt: Shirt{ logo: "nike", size: 14, }, } }
iShoe.go: 抽象產(chǎn)品
package main type IShoe interface { setLogo(logo string) setSize(size int) getLogo() string getSize() int } type Shoe struct { logo string size int } func (s *Shoe) setLogo(logo string) { s.logo = logo } func (s *Shoe) getLogo() string { return s.logo } func (s *Shoe) setSize(size int) { s.size = size } func (s *Shoe) getSize() int { return s.size }
adidasShoe.go: 具體產(chǎn)品
package main type AdidasShoe struct { Shoe }
nikeShoe.go: 具體產(chǎn)品
package main type NikeShoe struct { Shoe }
iShirt.go: 抽象產(chǎn)品
package main type IShirt interface { setLogo(logo string) setSize(size int) getLogo() string getSize() int } type Shirt struct { logo string size int } func (s *Shirt) setLogo(logo string) { s.logo = logo } func (s *Shirt) getLogo() string { return s.logo } func (s *Shirt) setSize(size int) { s.size = size } func (s *Shirt) getSize() int { return s.size }
adidasShirt.go: 具體產(chǎn)品
package main type AdidasShirt struct { Shirt }
nikeShirt.go: 具體產(chǎn)品
package main type NikeShirt struct { Shirt }
main.go: 客戶端代碼
package main import "fmt" func main() { adidasFactory, _ := GetSportsFactory("adidas") nikeFactory, _ := GetSportsFactory("nike") nikeShoe := nikeFactory.makeShoe() nikeShirt := nikeFactory.makeShirt() adidasShoe := adidasFactory.makeShoe() adidasShirt := adidasFactory.makeShirt() printShoeDetails(nikeShoe) printShirtDetails(nikeShirt) printShoeDetails(adidasShoe) printShirtDetails(adidasShirt) } func printShoeDetails(s IShoe) { fmt.Printf("Logo: %s", s.getLogo()) fmt.Println() fmt.Printf("Size: %d", s.getSize()) fmt.Println() } func printShirtDetails(s IShirt) { fmt.Printf("Logo: %s", s.getLogo()) fmt.Println() fmt.Printf("Size: %d", s.getSize()) fmt.Println() }
output.txt: 執(zhí)行結(jié)果
Logo: nike
Size: 14
Logo: nike
Size: 14
Logo: adidas
Size: 14
Logo: adidas
Size: 14
到此這篇關(guān)于Golang設(shè)計模式中抽象工廠模式詳細(xì)講解的文章就介紹到這了,更多相關(guān)Go抽象工廠模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何判斷Golang接口是否實(shí)現(xiàn)的操作
這篇文章主要介紹了如何判斷Golang接口是否實(shí)現(xiàn)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12golang?waitgroup輔助并發(fā)控制使用場景和方法解析
Golang?提供了簡潔的?go?關(guān)鍵字來讓開發(fā)者更容易的進(jìn)行并發(fā)編程,同時也提供了?WaitGroup?對象來輔助并發(fā)控制,今天我們就來分析下?WaitGroup?的使用方法,順便瞧一瞧它的底層源碼2023-09-09Golang基礎(chǔ)學(xué)習(xí)之map的示例詳解
哈希表是常見的數(shù)據(jù)結(jié)構(gòu),有的語言會將哈希稱作字典或者映射,在Go中,哈希就是常見的數(shù)據(jù)類型map,本文就來聊聊Golang中map的相關(guān)知識吧2023-03-03Golang?依賴注入經(jīng)典解決方案uber/fx理論解析
這篇文章主要為大家介紹了Golang依賴注入經(jīng)典解決方案uber/fx理論解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05