抽象工廠模式
簡介
wiki: 抽象工廠模式(英語:Abstract factory pattern)是一種軟體開發設計模式。抽象工廠模式提供了一種方式,可以將一組具有同一主題的單獨的工廠封裝起來。在正常使用中,客戶端程式需要建立抽象工廠的具體實現,然後使用抽象工廠作為介面來建立這一主題的具體物件。客戶端程式不需要知道(或關心)它從這些內部的工廠方法中獲得物件的具體型別,因為客戶端程式僅使用這些物件的通用介面。抽象工廠模式將一組物件的實現細節與他們的一般使用分離開來。
在前面的文章中我們介紹過工廠模式的前兩種:
而今天要介紹的 抽象工廠模式
就是工廠模式中的最後一種了,是前兩種模式的補充,
工廠模式用來建立一組相關或者相互依賴的物件,與工廠方法模式的區別就在於,工廠方法模式針對的是一個產品等級結構;而抽象工廠模式則是針對的多個產品等級結構,
我們可以將一種產品等級想象為一個產品族,所謂的產品族,是指位於不同產品等級結構中功能相關聯的產品組成的家族。
程式碼實現
還是以 工廠方法模式
中我們舉的賣包子的例子:
在之前的工廠方法中,需要在齊市和廣東開兩家包子店,那麼就需要從一個工廠介面中實現兩個工廠結構體,齊市店和廣東店屬於兩個產品族,豬肉包和三鮮餡包子屬於同一個等級結構,
所以在抽象工廠模式中,我們要新增兩個工廠,每個工廠實現兩個產品的建立方法:
-
工廠介面和產品介面
type FactoryInterface interface { CreatePigMeatBuns() ProductInterface // 建立豬肉餡產品 Create3SBuns() ProductInterface // 建立三鮮餡產品 } type ProductInterface interface { Intro() } 複製程式碼
-
實現4種產品
type GDPigMeatBuns struct {
}
func (p GDPigMeatBuns) Intro() {
fmt.Println("廣東豬肉餡包子")
}
// TODO ... 其他產品實現方法沒區別... 就省略掉了,需要的話請去倉庫裡看原始碼
複製程式碼
- 實現工廠
// 齊市包子鋪
type QSFactory struct {
}
func (qs QSFactory) CreatePigMeatBuns() ProductInterface {
return QSPigMeatBuns{}
}
func (qs QSFactory) Create3SBuns() ProductInterface {
return QS3SBuns{}
}
// 廣東包子鋪
type GDFactory struct {
}
func (gd GDFactory) CreatePigMeatBuns() ProductInterface {
return GDPigMeatBuns{}
}
func (gd GDFactory) Create3SBuns() ProductInterface {
return GD3SBuns{}
}
複製程式碼
-
這樣就可以通過抽象工廠建立了
var f FactoryInterface // 特意以這種方式宣告,更好的體會抽象工廠模式的好處 f = new(QSFactory) b := f.CreatePigMeatBuns() b.Intro() 複製程式碼
優缺點
-
優點: 抽象工廠模式除了具有工廠方法模式的優點外,最主要的優點就是可以在類的內部對產品族進行約束。所謂的產品族,一般或多或少的都存在一定的關聯,抽象工廠模式就可以在類內部對產品族的關聯關係進行定義和描述,而不必專門引入一個新的類來進行管理。
-
缺點: 產品族的擴充套件將是一件十分費力的事情,假如產品族中需要增加一個新的產品,則幾乎所有的工廠類都需要進行修改。所以使用抽象工廠模式時,對產品等級結構的劃分是非常重要的
總結
現在我們就講完了三種工廠模式的構建了,他們之間有區別又有聯絡,具體使用什麼模式,就見仁見智了,經常性的,當業務發展過程中,會從簡單工廠模式一步一步變成工廠方法,或者抽象工廠模式
建立型設計模式的結果都是得到指定物件,模式之間沒有好壞,按需使用,只要能夠達到解耦的目的,就是好模式。
上述程式碼均放在 golang-design-patterns 這個倉庫中
打個廣告,推薦一下自己寫的 go web框架 bingo,求star,求PR ~