抽象工廠 Go

2021-10-03 11:12:13 字數 1711 閱讀 9458

工廠方法將一族相關物件分組在一起,如果我們將物件族按更結構化的層次分組會怎樣?

抽象工廠設計模式是乙個新的分組層,用於實現更大更複雜的組合物件,該物件通過介面使用。對族中的物件分組和對族進行分組的想法是要擁有可以互換且更容易成長的大型工廠。開發的早期階段,與工廠和抽象工廠合作要比等到所有具體實現都完成再啟動**要容易的多。另外,除非我們知道在特定領域的庫存將非常大並且很容易的分為幾類,否則不會編寫抽象工廠。

當物件數量增長到足以建立乙個唯一的點來獲取所有物件時,對相關產品族物件進行分組是非常方便的,這是獲得執行時物件建立靈活性的唯一方法。

再以整車製造為例,我們需要重用在建造者模式中實現的工廠。我們希望展示使用不同方法來解決同一問題的相似性,以便看到每一種方法的優缺點。中間會展示go的隱式介面功能,因為我們不需要接觸任何東西,最後將建立乙個新的工廠來建立裝運訂單。

首先是整車工廠(抽象工廠),該介面定義了乙個具有build方法(輸入值為工廠型別,返回值為vehicle,也是乙個介面,所有車輛都應實現該介面,和乙個錯誤資訊)的工廠,所有具體工廠應實現該介面。

type vehiclefactory inte***ce
其次是buildfactory方法,輸入乙個工廠型別,輸出值為具體工廠和錯誤資訊。該方法根據輸入的型別資訊,產生對應的工廠。

const (

ca***ctorytype = 1

motorbikefactorytype = 2

)func buildfactory(f int) (vehiclefactory, error)

}

具體工廠的定義如下:

const (

luxurycartype = 1

familycartype = 2

)type ca***ctory struct{}

func (c *ca***ctory) build(v int) (vehicle, error)

}

具體工廠中接受乙個具體車輛的型別,返回對應的車輛例項。

func testca***ctory(t *testing.t) 

carvehicle, err := carf.build(luxurycartype)

if err != nil

t.logf("car vehicle has %d seats\n", carvehicle.numwheels())

luxurycar, ok := carvehicle.(car)

if !ok

t.logf("luxury var has %d doors.\n", luxurycar.numdoors())

}

測試**中首先根據buildfactory方法獲取對應的工廠方法,檢查是否出錯,再根據對應的工廠方法產出對應的car,再訪問vehicle介面的numwheels方法獲取具體資訊,根據型別斷言luxurycar, ok := carvehicle.(car)確定該型別是不是所期待的具體型別,最後訪問具體型別的與介面不同的方法,確定luxurycar的門有4個。

完整**見

抽象工廠模式 Go語言設計模式 抽象工廠

想象一下你需要買包括運動鞋和運動服的運動套裝,大多數時候你想買同乙個工廠生產的一套運動套裝,比如nike套裝或adidas套裝。你想要的具體產品是成套的鞋子和短褲,這就是抽象工廠運用的場景,這些產品將由nike或adidas的抽象工廠建立。以下是工廠介面 以下是兩個產品介面 現在讓我們來看抽象工廠介...

go設計模式之抽象工廠

以下就是實現的 package main import fmt type iproduct inte ce type iphone struct func p iphone showbrand type mac struct func pc mac showbrand type factory in...

Go設計模式 抽象工廠模式

對照下面模板類圖作個簡單說明抽象工廠的四個角色叭。抽象工廠角色 即圖中的abstract creator,抽象工廠核心,也就是那個 超級工廠 與應用程式無關,超級工廠所建立的工廠必須實現提供的介面 具體工廠角色 即圖中的creator,用於建立具體產品物件。抽象產品角色 即圖中的abstract p...