亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Golang設(shè)計(jì)模式中抽象工廠模式詳細(xì)講解

 更新時(shí)間:2023年01月11日 15:24:48   作者:Ch3n  
抽象工廠模式用于生成產(chǎn)品族的工廠,所生成的對(duì)象是有關(guān)聯(lián)的。如果抽象工廠退化成生成的對(duì)象無(wú)關(guān)聯(lián)則成為工廠函數(shù)模式。比如本例子中使用RDB和XML存儲(chǔ)訂單信息,抽象工廠分別能生成相關(guān)的主訂單信息和訂單詳情信息

抽象工廠模式

抽象工廠模式是一種創(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)的操作

    這篇文章主要介紹了如何判斷Golang接口是否實(shí)現(xiàn)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • golang?waitgroup輔助并發(fā)控制使用場(chǎng)景和方法解析

    golang?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-09
  • Go日志框架zap增強(qiáng)及源碼解讀

    Go日志框架zap增強(qiáng)及源碼解讀

    這篇文章主要為大家介紹了Go日志框架zap增強(qiáng)及源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • go語(yǔ)言執(zhí)行windows下命令行的方法

    go語(yǔ)言執(zhí)行windows下命令行的方法

    這篇文章主要介紹了go語(yǔ)言執(zhí)行windows下命令行的方法,實(shí)例分析了Go語(yǔ)言操作windows下命令行的技巧,需要的朋友可以參考下
    2015-03-03
  • Golang基礎(chǔ)學(xué)習(xí)之map的示例詳解

    Golang基礎(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-03
  • Go爬蟲(chóng)(http、goquery和colly)詳解

    Go爬蟲(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-09
  • golang context接口類型方法介紹

    golang context接口類型方法介紹

    這篇文章主要為大家介紹了golang context接口類型方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 深入了解Golang中占位符的使用

    深入了解Golang中占位符的使用

    在寫(xiě)?golang?的時(shí)候,也是有對(duì)應(yīng)的格式控制符,也叫做占位符,寫(xiě)這個(gè)占位符,需要有對(duì)應(yīng)的數(shù)據(jù)與之對(duì)應(yīng),不能瞎搞。本文就來(lái)和大家聊聊Golang中占位符的使用,希望對(duì)大家有所幫助
    2023-03-03
  • Go 高效截取字符串的一些思考

    Go 高效截取字符串的一些思考

    這篇文章主要介紹了Go 高效截取字符串的一些思考,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Golang?依賴注入經(jīng)典解決方案uber/fx理論解析

    Golang?依賴注入經(jīng)典解決方案uber/fx理論解析

    這篇文章主要為大家介紹了Golang依賴注入經(jīng)典解決方案uber/fx理論解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05

最新評(píng)論