Golang - Design Pattern #2: 工廠模式 (Factory)

更新於 發佈於 閱讀時間約 5 分鐘

工廠模式 (Factory) 在物件創建中佔有舉足輕重的位置,讓我們能以更模組化的方式管理物件的生成。這篇文章將帶領你深入工廠模式在Go語言中的實踐。


簡介

工廠模式背後的核心思想是將物件創建的邏輯和使用分離,這使得我們的應用能夠更容易地擴展並維護。


實際應用與實現


動物的叫聲

考慮一個需求:我們的系統中有多種動物,每種動物都有自己的叫聲。
type Animal interface {
Speak() string
}

type Dog struct{}
func (d *Dog) Speak() string {
return "Woof!"
}

type Cat struct{}
func (c *Cat) Speak() string {
return "Meow!"
}


支付系統接口

考慮一個更實際的例子:在一個電子商務平台上,我們希望支援多種支付方式。
type PaymentMethod interface {
Pay(amount float64) string
}

type Paypal struct{}
func (p *Paypal) Pay(amount float64) string {
return fmt.Sprintf("Paid %f via Paypal", amount)
}

type CreditCard struct{}
func (c *CreditCard) Pay(amount float64) string {
return fmt.Sprintf("Paid %f using Credit Card", amount)
}


工廠模式 + map

在傳統的工廠模式中,我們可能會使用條件語句(如if或switch)來確定要創建哪種類型的實例。但這樣的做法,每當新增新的類型時,就需要修改工廠的代碼。使用 map 作為工廠可以解決這個問題。

簡單來說,map允許我們將字符串(如 dogpaypal)映射到具體的創建函數。這樣,當需要新增類型時,只需擴展這個 map,而不是修改工廠的主要邏輯。

Animal Factory

Animal Factory

Payment Factory

Payment Factory

在這個上面的兩個流程圖中,當客戶端呼叫 GetAnimalGetPaymentMethod時,函數內部會查找相應的map以獲得創建函數,然後使用該函數創建並返回相應的實例。


// Animal Map
var AnimalFactory = map[string]func() Animal{
"dog": func() Animal { return &Dog{} },
"cat": func() Animal { return &Cat{} },
}

// Payment Map
var PaymentFactory = map[string]func() PaymentMethod{
"paypal": func() PaymentMethod { return &Paypal{} },
"creditcard": func() PaymentMethod { return &CreditCard{} },
}

// Animal Factory
func GetAnimal(t string) Animal {
if factory, ok := AnimalFactory[t]; ok {
return factory()
}
return nil
}

// Payment Factory
func GetPaymentMethod(method string) PaymentMethod {
if factory, ok := PaymentFactory[method]; ok {
return factory()
}
return nil
}


func main() {
animal := GetAnimal("dog")
fmt.Println(animal.Speak()) // Woof!

payment := GetPaymentMethod("paypal")
fmt.Println(payment.Pay(100.5)) // Paid 100.5 via Paypal
}


結語

通過使用map進行工廠模式的實現,我們可以更加靈活地新增物件類型,而無需修改現有代碼。此外,這種方式還簡化了我們的工廠邏輯。希望這兩個實際的例子能幫助你更好地理解工廠模式在Go中的應用,並在實際開發中靈活使用!🚀

留言
avatar-img
留言分享你的想法!
KH Huang-avatar-img
發文者
2023/08/23
Golang - Design Pattern #3: 策略模式 (Strategy)提及了這篇文章,趕快過去看看吧!
avatar-img
KH Huang的沙龍
36會員
194內容數
歡迎來到【代碼的詩情】:探索程式語言之美 系列,這是一場優雅的程式之旅,透過詩歌的抒發,尋找不同程式語言的美感和精髓。 在這個系列中,我們將透過文字的韻律,深入探索多種程式語言的核心概念和語法,以及它們獨特的應用和技巧。每一篇詩歌都是一個故事,每一段代碼都是一句詩句,讓代碼的旋律和詩情在其中相互交織。
KH Huang的沙龍的其他內容
2023/09/06
嗨!今天我們來深入探討鏈式方法模式,也就是讓你可以一路連續調用方法,看起來好像在鏈接它們似的。那麼,讓我們馬上進入主題吧!
Thumbnail
2023/09/06
嗨!今天我們來深入探討鏈式方法模式,也就是讓你可以一路連續調用方法,看起來好像在鏈接它們似的。那麼,讓我們馬上進入主題吧!
Thumbnail
2023/09/03
嗨,大家好!今天我們來聊聊什麼是延遲評估模式,它的好處是啥,還有在 Go 裡面是怎麼玩的。
Thumbnail
2023/09/03
嗨,大家好!今天我們來聊聊什麼是延遲評估模式,它的好處是啥,還有在 Go 裡面是怎麼玩的。
Thumbnail
2023/09/03
在許多大型系統中,不同的子系統需要共享和修改某些資訊以達到一個共同目的。在這種情況下,傳統的方法可能會造成混亂和冗餘。這時,黑板模式出現了,它提供了一個統一的架構,讓這些子系統可以有效率地協作。
Thumbnail
2023/09/03
在許多大型系統中,不同的子系統需要共享和修改某些資訊以達到一個共同目的。在這種情況下,傳統的方法可能會造成混亂和冗餘。這時,黑板模式出現了,它提供了一個統一的架構,讓這些子系統可以有效率地協作。
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
嗨!今天我們來深入探討鏈式方法模式,也就是讓你可以一路連續調用方法,看起來好像在鏈接它們似的。那麼,讓我們馬上進入主題吧!
Thumbnail
嗨!今天我們來深入探討鏈式方法模式,也就是讓你可以一路連續調用方法,看起來好像在鏈接它們似的。那麼,讓我們馬上進入主題吧!
Thumbnail
👨‍💻簡介 在Go語言中,Interface 是一個重要且強大的概念。Interface提供了一種方式來定義對象之間的契約,讓你可以設計更具有靈活性和可擴展性的程式碼。 你可以把Interface想像成是一種約定,讓不同的東西彼此溝通的方式變得特別靈活和好擴充,告訴程式裡的各個元件彼此要怎麼合作
Thumbnail
👨‍💻簡介 在Go語言中,Interface 是一個重要且強大的概念。Interface提供了一種方式來定義對象之間的契約,讓你可以設計更具有靈活性和可擴展性的程式碼。 你可以把Interface想像成是一種約定,讓不同的東西彼此溝通的方式變得特別靈活和好擴充,告訴程式裡的各個元件彼此要怎麼合作
Thumbnail
訪問者模式 (Visitor Pattern) 是一種設計模式,它允許開發者將新的操作新增到現有物件結構中,而不必修改該結構的內部代碼。該模式的重點是將操作和物件結構分離,提供一個彈性的方式新增新的行為。
Thumbnail
訪問者模式 (Visitor Pattern) 是一種設計模式,它允許開發者將新的操作新增到現有物件結構中,而不必修改該結構的內部代碼。該模式的重點是將操作和物件結構分離,提供一個彈性的方式新增新的行為。
Thumbnail
在許多複雜的程式設計問題中,如何將抽象與其具體實現分離開來,往往是一個重要的挑戰。橋接模式正是為了解決這樣的問題而生。透過橋接模式 (Bridge Pattern),不僅可以確保抽象和實現在結構上分離,還能提供一套彈性的機制來適應變化。
Thumbnail
在許多複雜的程式設計問題中,如何將抽象與其具體實現分離開來,往往是一個重要的挑戰。橋接模式正是為了解決這樣的問題而生。透過橋接模式 (Bridge Pattern),不僅可以確保抽象和實現在結構上分離,還能提供一套彈性的機制來適應變化。
Thumbnail
👨‍💻簡介 在 Go 語言中,函數(Function)是一個強大且重要的概念,就像食譜一樣,告訴你應該如何處理食材,最後得到一道美味的料理。經過哪些程序讓程式更有組織性和可讀性。函數可幫助你將程式碼區塊組織成可重複使用的元件,進而執行特定的任務。
Thumbnail
👨‍💻簡介 在 Go 語言中,函數(Function)是一個強大且重要的概念,就像食譜一樣,告訴你應該如何處理食材,最後得到一道美味的料理。經過哪些程序讓程式更有組織性和可讀性。函數可幫助你將程式碼區塊組織成可重複使用的元件,進而執行特定的任務。
Thumbnail
創建物件有時是一個資源密集型和耗時的過程,尤其是當涉及到從資料庫或其他來源初始化物件時。原型模式就是為了解決這種問題🔧,它提供了一種方法,能夠通過複製一個已存在的物件來迅速創建新物件,而不是從頭開始。
Thumbnail
創建物件有時是一個資源密集型和耗時的過程,尤其是當涉及到從資料庫或其他來源初始化物件時。原型模式就是為了解決這種問題🔧,它提供了一種方法,能夠通過複製一個已存在的物件來迅速創建新物件,而不是從頭開始。
Thumbnail
當我們在處理一連串的事件或請求時,責任鏈模式 (Chain of Responsibility Pattern) 就像一位隱形的助手🤖,幫助我們將這些請求一一分發給合適的處理者。
Thumbnail
當我們在處理一連串的事件或請求時,責任鏈模式 (Chain of Responsibility Pattern) 就像一位隱形的助手🤖,幫助我們將這些請求一一分發給合適的處理者。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News