Golang設(shè)計(jì)模式中抽象工廠模式詳細(xì)講解
抽象工廠模式
抽象工廠模式是一種創(chuàng)建型設(shè)計(jì)模式, 它能創(chuàng)建一系列相關(guān)的對(duì)象, 而無(wú)需指定其具體類。
抽象工廠定義了用于創(chuàng)建不同產(chǎn)品的接口, 但將實(shí)際的創(chuàng)建工作留給了具體工廠類。 每個(gè)工廠類型都對(duì)應(yīng)一個(gè)特定的產(chǎn)品變體。
在創(chuàng)建產(chǎn)品時(shí), 客戶端代碼調(diào)用的是工廠對(duì)象的構(gòu)建方法, 而不是直接調(diào)用構(gòu)造函數(shù) (new操作符)。 由于一個(gè)工廠對(duì)應(yīng)一種產(chǎn)品變體, 因此它創(chuàng)建的所有產(chǎn)品都可相互兼容。
客戶端代碼僅通過(guò)其抽象接口與工廠和產(chǎn)品進(jìn)行交互。 該接口允許同一客戶端代碼與不同產(chǎn)品進(jìn)行交互。 你只需創(chuàng)建一個(gè)具體工廠類并將其傳遞給客戶端代碼即可。
概念示例
讓我們假設(shè)一下, 如果你想要購(gòu)買(mǎi)一組運(yùn)動(dòng)裝備, 比如一雙鞋與一件襯衫這樣由兩種不同產(chǎn)品組合而成的套裝。 相信你會(huì)想去購(gòu)買(mǎi)同一品牌的商品, 這樣商品之間能夠互相搭配起來(lái)。
如果我們把這樣的行為轉(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è)計(jì)模式中抽象工廠模式詳細(xì)講解的文章就介紹到這了,更多相關(guān)Go抽象工廠模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何判斷Golang接口是否實(shí)現(xiàn)的操作
這篇文章主要介紹了如何判斷Golang接口是否實(shí)現(xiàn)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12golang?waitgroup輔助并發(fā)控制使用場(chǎng)景和方法解析
Golang?提供了簡(jiǎn)潔的?go?關(guān)鍵字來(lái)讓開(kāi)發(fā)者更容易的進(jìn)行并發(fā)編程,同時(shí)也提供了?WaitGroup?對(duì)象來(lái)輔助并發(fā)控制,今天我們就來(lái)分析下?WaitGroup?的使用方法,順便瞧一瞧它的底層源碼2023-09-09Golang基礎(chǔ)學(xué)習(xí)之map的示例詳解
哈希表是常見(jiàn)的數(shù)據(jù)結(jié)構(gòu),有的語(yǔ)言會(huì)將哈希稱作字典或者映射,在Go中,哈希就是常見(jiàn)的數(shù)據(jù)類型map,本文就來(lái)聊聊Golang中map的相關(guān)知識(shí)吧2023-03-03Go爬蟲(chóng)(http、goquery和colly)詳解
goquery可以避免操作復(fù)雜的正則表達(dá)式,它可以直接根據(jù)url獲取一個(gè)Document對(duì)象,然后根據(jù)標(biāo)簽選擇器、類選擇器和id選擇器獲取相應(yīng)的選擇對(duì)象,進(jìn)行自定義的操作,這篇文章主要介紹了Go爬蟲(chóng)(http、goquery和colly),需要的朋友可以參考下2022-09-09Golang?依賴注入經(jīng)典解決方案uber/fx理論解析
這篇文章主要為大家介紹了Golang依賴注入經(jīng)典解決方案uber/fx理論解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05