wiki: 抽象工廠模式(英語:Abstract factory pattern)是一種軟件開發設計模式。抽象工廠模式提供了一種方式,能夠將一組具備同一主題的單獨的工廠封裝起來。在正常使用中,客戶端程序須要建立抽象工廠的具體實現,而後使用抽象工廠做爲接口來建立這一主題的具體對象。客戶端程序不須要知道(或關心)它從這些內部的工廠方法中得到對象的具體類型,由於客戶端程序僅使用這些對象的通用接口。抽象工廠模式將一組對象的實現細節與他們的通常使用分離開來。git
在前面的文章中咱們介紹過工廠模式的前兩種:github
而今天要介紹的 抽象工廠模式
就是工廠模式中的最後一種了,是前兩種模式的補充,設計模式
工廠模式用來建立一組相關或者相互依賴的對象,與工廠方法模式的區別就在於,工廠方法模式針對的是一個產品等級結構;而抽象工廠模式則是針對的多個產品等級結構, 咱們能夠將一種產品等級想象爲一個產品族,所謂的產品族,是指位於不一樣產品等級結構中功能相關聯的產品組成的家族。框架
仍是以 工廠方法模式
中咱們舉的賣包子的例子:post
在以前的工廠方法中,須要在齊市和廣東開兩家包子店,那麼就須要從一個工廠接口中實現兩個工廠結構體,齊市店和廣東店屬於兩個產品族,豬肉包和三鮮餡包子屬於同一個等級結構,ui
因此在抽象工廠模式中,咱們要添加兩個工廠,每一個工廠實現兩個產品的建立方法:spa
工廠接口和產品接口設計
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 ~