抽象工廠模式
抽象工廠模式(Abstra Factory Pattern)是圍繞一個超級工廠掂器,創(chuàng)建其他的工廠。這種類型的設(shè)計模式屬于創(chuàng)建型模式。
抽象工廠解決的問題
在工廠模式中,一個具體的工廠對應(yīng)一種具體的產(chǎn)品赡鲜。但是十减,有時候我們需要工廠可以提供多個產(chǎn)品對象菱皆,而不是單一產(chǎn)品對象汤求。
我們首先要理解兩個概念
- 產(chǎn)品等級結(jié)構(gòu) 產(chǎn)品的等級結(jié)構(gòu)就是產(chǎn)品的繼承結(jié)構(gòu),如一個模型工廠鳍徽,可以畫出圓形资锰,長方形和正方形的模型。這里抽象的模型工廠和具體的模型構(gòu)成了產(chǎn)品等級結(jié)構(gòu)阶祭。
- 產(chǎn)品族 在抽象工廠模式中绷杜,產(chǎn)品族指的是同一個工廠生產(chǎn)的,位于不同產(chǎn)品等級結(jié)構(gòu)的一組產(chǎn)品濒募。如模具廠生產(chǎn)的紅色圓形模具鞭盟,圓形模型屬于模型產(chǎn)品等級結(jié)構(gòu)中,紅色屬于顏料產(chǎn)品等級結(jié)構(gòu)中瑰剃。
例如我們的衣服齿诉,上衣由一個工廠生產(chǎn),有衛(wèi)衣晌姚,有襯衫粤剧,有西服。褲子由一個工廠生產(chǎn)挥唠,有短褲抵恋,有休閑褲,有西褲宝磨。這樣弧关,不同的上衣和不同的褲子組合起來,就是成了一套衣服唤锉,
就像QQ秀一樣世囊,當(dāng)你在商城買了一套衣服褲子的時候,就是由這個抽象工廠所生產(chǎn)的窿祥。抽象工廠從幾個具體的工廠中獲取衣服株憾,褲子,帽子等晒衩。組合成一套進(jìn)行成套的售賣嗤瞎。
優(yōu)點
當(dāng)一個產(chǎn)品族中多個對象被設(shè)計成一起工作時,它可以保證客戶始終只使用同一個產(chǎn)品族中的對象
缺點
產(chǎn)品族拓展非常困難浸遗,需要修改很多代碼
抽象工廠實現(xiàn)
1.1 設(shè)計接口
設(shè)計一個模型接口和色彩接口
//Shape 模型接口
type Shape interface {
Draw()
}
//Color 色彩接口
type Color interface {
Fill()
}
1.2 實現(xiàn)模型類
//Circle 實現(xiàn)模型接口的圓形類
type Circle struct{}
//Square 實現(xiàn)模型接口的正方形類
type Square struct{}
//Draw Circle類的Draw方法
func (c Circle) Draw() {
fmt.Println("Circle Draw() method")
}
//Draw Square類的Draw方法
func (s Square) Draw() {
fmt.Println("Square Draw() method")
}
1.3 實現(xiàn)色彩類
//Red 實現(xiàn)色彩接口的紅色類
type Red struct{}
//Green 實現(xiàn)色彩接口的綠色類
type Green struct{}
//Fill 紅色類的Fill方法
func (r Red) Fill() {
fmt.Println("Red Fill() method")
}
//Fill 綠色類的Fill方法
func (g Green) Fill() {
fmt.Println("Green Fill() method")
}
1.4 設(shè)計抽象工廠接口
//AbstractFactory 抽象工廠接口
type AbstractFactory interface {
GetShape(shapeName string) Shape
GetColor(colorName string) Color
}
1.5 根據(jù)抽象工廠的接口實現(xiàn)具體工廠類
//ShapeFactory 模型工廠的類
type ShapeFactory struct{}
//ColorFactory 色彩工廠的類
type ColorFactory struct{}
//GetShape 模型工廠實例獲取模型子類的方法
func (sh ShapeFactory) GetShape(shapeName string) Shape {
switch shapeName {
case "circle":
return &Circle{}
case "square":
return &Square{}
default:
return nil
}
}
//GetColor 模型工廠實例不需要色彩方法
func (sh ShapeFactory) GetColor(colorName string) Color {
return nil
}
//GetShape 色彩工廠實例不需要獲取模型方法
func (cf ColorFactory) GetShape(shapeName string) Shape {
return nil
}
//GetColor 色彩工廠實例,獲取具體色彩子類
func (cf ColorFactory) GetColor(colorName string) Color {
switch colorName {
case "red":
return &Red{}
case "green":
return &Green{}
default:
return nil
}
}
1.6 實現(xiàn)一個超級工廠
超級工廠用于獲取模型工廠或者色彩工廠實例
//FactoryProducer 超級工廠類箱亿,用于獲取工廠實例
type FactoryProducer struct{}
//GetFactory 獲取工廠方法
func (fp FactoryProducer) GetFactory(factoryname string) AbstractFactory {
switch factoryname {
case "color":
return &ColorFactory{}
case "shape":
return &ShapeFactory{}
default:
return nil
}
}
//NewFactoryProducer 創(chuàng)建FactoryProducer類
func NewFactoryProducer() *FactoryProducer {
return &FactoryProducer{}
}