2.Golang設(shè)計模式之抽象工廠模式

抽象工廠模式

GitHub代碼鏈接

抽象工廠模式(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{}
}

上一篇

1.Golang設(shè)計模式之工廠模式

下一篇

3.Golang設(shè)計模式之單例模式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末跛锌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌髓帽,老刑警劉巖菠赚,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異郑藏,居然都是意外死亡衡查,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門必盖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拌牲,“玉大人,你說我怎么就攤上這事歌粥∷觯” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵失驶,是天一觀的道長土居。 經(jīng)常有香客問我,道長嬉探,這世上最難降的妖魔是什么擦耀? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮涩堤,結(jié)果婚禮上眷蜓,老公的妹妹穿的比我還像新娘。我一直安慰自己定躏,他們只是感情好账磺,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著痊远,像睡著了一般垮抗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碧聪,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天冒版,我揣著相機(jī)與錄音,去河邊找鬼逞姿。 笑死辞嗡,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的滞造。 我是一名探鬼主播续室,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谒养!你這毒婦竟也來了挺狰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎丰泊,沒想到半個月后薯定,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡瞳购,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年话侄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片学赛。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡年堆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出罢屈,到底是詐尸還是另有隱情嘀韧,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布缠捌,位于F島的核電站锄贷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏曼月。R本人自食惡果不足惜谊却,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哑芹。 院中可真熱鬧炎辨,春花似錦、人聲如沸聪姿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽末购。三九已至破喻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盟榴,已是汗流浹背曹质。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留擎场,地道東北人羽德。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像迅办,于是被迫代替她去往敵國和親宅静。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359