精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Go 語言實現創建型設計模式 - 工廠模式

開發 前端
在介紹工廠模式的使用場景之前,我們需要先簡單了解工廠模式的組成結構,一般分為抽象產品、具體產品、抽象工廠和具體工廠。

?01 介紹

工廠模式是一種創建型設計模式,包含三種類型,分別是簡單工廠、工廠方法和抽象工廠。

在《設計模式》[1]一書中,因為 GoF[2] 認為簡單工廠是工廠方法的一種特例,所以 GoF 把工廠模式分為兩種類型,分別是工廠方法和抽象工廠。

本文我們使用第一種分類方式,分別介紹一下工廠模式的三種類型。

02 使用場景

在介紹工廠模式的使用場景之前,我們需要先簡單了解工廠模式的組成結構,一般分為抽象產品、具體產品、抽象工廠和具體工廠。

注意:簡單工廠模式,不區分抽象工廠和具體工廠。

簡單工廠

簡單工廠適用于具體產品較少,且不會頻繁添加具體產品的場景。因為每多一個具體產品,在工廠中就多一個 if 分支。

工廠方法

工廠方法適用于具體產品較多,且需要頻繁添加具體產品的場景。使用工廠方法可以避免使用 if 分支,當我們需要添加具體產品時,只需創建新的具體產品和具體工廠,符合開閉原則和單一職責原則。

而且還可以將每個具體產品的創建邏輯拆分到不同的工廠中,避免使用一個工廠導致的代碼過于復雜。

注意:拆分多個工廠,則需要維護多個工廠的代碼。

抽象工廠

抽象工廠適用于一個具體工廠需要負責生產多個不同產品,并且工廠的職責不會繼續增加的場景(即抽象工廠定義的一組方法不會繼續增加)。

否則,不僅所有具體工廠都需要修改,抽象產品和具體產品也需要修改,違反開閉原則。

03 實現方式

簡單工廠

簡單工廠模式違反了開閉原則,嚴格意義上不算是一個設計模式,它主要包括三個結構,分別是工廠、抽象產品和具體產品。

  • 工廠 - 負責調用具體產品生產產品,返回值是抽象產品(接口)。
  • 抽象產品 - 負責定義產品,接口類型,包含一組方法。
  • 具體產品 - 負責被工廠調用,實現抽象產品(接口)。

工廠方法

工廠方法模式符合開閉原則,它相比簡單工廠模式,多了一個抽象工廠的結構,總共包括四個結構,分別是抽象工廠、具體工廠、抽象產品和具體產品。

  • 抽象工廠(單個) - 負責定義工廠,接口類型,包含一組方法。
  • 具體工廠(多個) - 負責通過實例化具體產品創建產品,實現抽象工廠(接口)。
  • 抽象產品(單個) - 負責定義產品,接口類型,包含一組方法。
  • 具體產品(多個) - 負責被具體工廠調用,實現抽象產品(接口)。

注意:此處“抽象工廠”是工廠方法模式中的一個結構,不要與抽象工廠模式混淆。

抽象工廠

抽象工廠模式也是總共包括四個結構,它與工廠方法模式不同,工廠方法模式中抽象產品只有一個,而抽象工廠模式抽象產品有多個。

但是,四個結構的職責與工廠方法模式相同。

  • 抽象工廠(單個)
  • 具體工廠(多個)
  • 抽象產品(多個)
  • 具體產品(多個)

04 Go 實現

簡單工廠

// IDrink 抽象產品 - 飲料
type IDrink interface {
Kind() // 抽象方法 - 類別
Name() // 抽象方法 - 名稱
}

// CocaCola 具體產品 - 可口可樂
type CocaCola struct {
}

// Kind 具體方法
func (c *CocaCola) Kind() {
fmt.Println("carbonated drinks")
}

// Name 具體方法
func (c *CocaCola) Name() {
fmt.Println("CocaCola")
}

// Sprite 具體產品 - 雪碧
type Sprite struct {
}

// Kind 具體方法
func (s *Sprite) Kind() {
fmt.Println("carbonated drinks")
}

// Name 具體方法
func (s *Sprite) Name() {
fmt.Println("Sprite")
}

// SimpleFactory 工廠
type SimpleFactory struct {
}

// Produce 生產 - 返回值(抽象產品)
func (s *SimpleFactory) Produce(name string) (drink IDrink) {
if name == "CocaCola" {
drink = new(CocaCola)
} else if name == "Sprite" {
drink = new(Sprite)
}
return
}

閱讀上面這段代碼,我們可以發現,我們通過代碼定義簡單工廠模式的三個結構。

定義一個包含一組方法的 IDrink 接口,代表抽象產品;

定義一個 CocaCola? 結構體和一個 Sprite? 結構體,并都實現 IDrink 接口,代表具體產品;

定義一個 SimpleFactory? 結構體,并定義一個返回值是 IDrink? 的 Produce 方法,代表工廠。

工廠方法

// IDrink 抽象產品
type IDrink interface {
Kind() // 抽象方法
Name() // 抽象方法
}

// CocaCola 具體產品
type CocaCola struct {
}

// Kind 具體方法
func (c *CocaCola) Kind() {
fmt.Println("carbonated drinks")
}

// Name 具體方法
func (c *CocaCola) Name() {
fmt.Println("CocaCola")
}

// Sprite 具體產品
type Sprite struct {
}

// Kind 具體方法
func (s *Sprite) Kind() {
fmt.Println("carbonated drinks")
}

// Name 具體方法
func (s *Sprite) Name() {
fmt.Println("Sprite")
}

// IFactory 抽象工廠
type IFactory interface {
Produce() IDrink // 抽象方法
}

// CocaColaFactory 具體工廠
type CocaColaFactory struct {
}

// Produce 具體方法
func (c *CocaColaFactory) Produce() (drink IDrink) {
drink = new(CocaCola)
return
}

// SpriteFactory 具體工廠
type SpriteFactory struct {
}

// Produce 具體方法
func (s *SpriteFactory) Produce() (drink IDrink) {
drink = new(Sprite)
return
}

閱讀上面這段代碼,我們通過代碼定義工廠方法模式的四個結構。

定義一個包含一組方法的 IDrink 接口,代表抽象產品;

定義一個 CocaCola? 結構體和一個 Sprite? 結構體,并都實現 IDrink 接口,代表具體產品;

定義一個包含一組方法的 IFactory 接口,代表抽象工廠;

定義一個 CocaColaFactory? 結構體和一個 SpriteFactory? 結構體,并都實現 IFactory 接口,代表具體工廠;

抽象工廠

// AbstractCola 抽象 Cola
type AbstractCola interface {
ColaKind() // 抽象方法
ColaName() // 抽象方法
}

// AbstractSprite 抽象 Sprite
type AbstractSprite interface {
SpriteKind() // 抽象方法
SpriteName() // 抽象方法
}

// AbstractFactory 抽象工廠
type AbstractFactory interface {
ProduceCola() AbstractCola // 抽象方法
ProduceSprite() AbstractSprite // 抽象方法
}

// CocaBrandCola 可口品牌 具體 Cola 產品
type CocaBrandCola struct {
}

func (c *CocaBrandCola) ColaKind() {
fmt.Println("Coca Brand carbonated drinks")
}

func (c *CocaBrandCola) ColaName() {
fmt.Println("Coca Brand Cola")
}

// CocaBrandSprite 可口品牌 具體 Sprite 產品
type CocaBrandSprite struct {
}

func (c *CocaBrandSprite) SpriteKind() {
fmt.Println("Coca Brand carbonated drinks")
}

func (c *CocaBrandSprite) SpriteName() {
fmt.Println("Coca Brand Sprite")
}

// CocaFactory 可口品牌 具體工廠
type CocaFactory struct {
}

func (c *CocaFactory) ProduceCola() (cola AbstractCola) {
cola = new(CocaBrandCola)
return
}

func (c *CocaFactory) ProduceSprite() (sprite AbstractSprite) {
sprite = new(CocaBrandSprite)
return
}

// PepsiBrandCola 百事品牌 具體 Cola 產品
type PepsiBrandCola struct {
}

func (p *PepsiBrandCola) ColaKind() {
fmt.Println("Pepsi Brand carbonated drinks")
}

func (p *PepsiBrandCola) ColaName() {
fmt.Println("Pepsi Brand Cola")
}

// PepsiBrandSprite 百事品牌 具體 Sprite 產品
type PepsiBrandSprite struct {
}

func (p *PepsiBrandSprite) SpriteKind() {
fmt.Println("Pepsi Brand carbonated drinks")
}

func (p *PepsiBrandSprite) SpriteName() {
fmt.Println("Pepsi Brand Sprite")
}

// PepsiFactory 百事品牌 具體工廠
type PepsiFactory struct {
}

func (p *PepsiFactory) ProduceCola() (cola AbstractCola) {
cola = new(PepsiBrandCola)
return
}

func (p *PepsiFactory) ProduceSprite() (sprite AbstractSprite) {
sprite = new(PepsiBrandSprite)
return
}

閱讀上面這段代碼,我們通過代碼定義抽象工廠模式的四個結構。

定義一個包含一組方法的 AbstractCola? 接口,和一個包含一組方法的 AbstractSprite 接口,均代表抽象產品(多個抽象產品);

定義一個 CocaBrandCola? 結構體,實現 AbstractCola? 接口;定義一個 CocaBrandSprite? 結構體,實現 AbstractSprite 接口;均代表具體產品(多個具體產品);

定義一個包含一組方法的 AbstractFactory 接口,代表抽象工廠;

定義一個 CocaFactory? 結構體,實現 AbstractFactory? 接口;定義一個 PepsiFactory? 結構體,實現 AbstractFactory 接口;均代表具體工廠(多個具體工廠);

05 總結

本文介紹的三種工廠模式中,簡單工廠和工廠方法比較常用,抽象工廠使用較少。

其中,簡單工廠適用于具體產品較少,且不會頻繁添加具體產品的場景;

工廠方法適用于具體產品較多,且需要頻繁添加具體產品的場景;

還有就是生產具體產品,代碼比較復雜,不只是實例化具體產品,還需要其他業務邏輯的場景;

或不希望代碼中使用一堆 if 分支的場景。

參考資料

?[1]《設計模式》: https://en.wikipedia.org/wiki/Design_Patterns

[2]GoF: http://wiki.c2.com/?GangOfFour

責任編輯:武曉燕 來源: Golang語言開發棧
相關推薦

2023-11-02 21:11:11

JavaScript設計模式

2021-03-06 22:50:58

設計模式抽象

2020-08-21 07:23:50

工廠模式設計

2022-01-12 13:33:25

工廠模式設計

2011-11-17 16:03:05

Java工廠模式Clojure

2023-03-21 07:57:37

Go語言設計模式

2024-07-30 08:12:04

Java消息go

2021-09-29 13:53:17

抽象工廠模式

2020-10-19 09:28:00

抽象工廠模式

2023-04-10 09:20:13

設計模式訪客模式

2023-05-04 08:47:31

命令模式抽象接口

2024-08-09 10:59:01

KubernetesSidecar模式

2024-03-06 13:19:19

工廠模式Python函數

2010-04-19 09:30:00

工廠模式PHP設計模式

2023-05-15 08:51:46

解釋器模式定義

2024-07-31 08:12:33

2013-11-26 16:29:22

Android設計模式

2009-01-15 10:55:29

JavaScript設計模式抽象工廠

2010-10-09 09:25:35

Python工廠模式

2022-05-09 08:04:50

工廠模式設計模式
點贊
收藏

51CTO技術棧公眾號

先锋亚洲精品| www555久久| 日韩精品亚洲专区| 亚洲最新视频在线| 超碰人人草人人| 搞黄视频在线观看| 精品在线视频一区| 久久99国产综合精品女同| 黄色性视频网站| 婷婷激情一区| 中文字幕佐山爱一区二区免费| 91在线视频九色| 国产一级片免费看| 少妇精品导航| 欧美美女bb生活片| 18黄暴禁片在线观看| 深夜福利视频网站| 视频一区二区不卡| 久久视频在线播放| 一边摸一边做爽的视频17国产 | 姑娘第5集在线观看免费好剧| 999国产精品| 亚洲国产精品资源| 欧美伦理片在线看| 少妇av在线| 国产性色一区二区| 亚洲综合在线做性| 久久久久久无码午夜精品直播| 久久中文字幕av| 亚洲大胆人体av| 免费看污污网站| yellow在线观看网址| 国产精品久久夜| 国语精品免费视频| 国产乱码精品一区二区三区精东| 亚洲久色影视| 国产成人在线观看| 午夜精品一区二区三区三上悠亚| 久久久久久99| 亚洲成人一二三区| 麻豆精品一二三| 2019中文字幕在线观看| 亚洲国产精品免费在线观看| 精品国产123区| 日韩一级免费观看| 色免费在线视频| 亚洲美女炮图| 亚洲最大的成人av| 日本黄色a视频| 国产精品毛片一区二区三区四区| 99国产精品久久久久久久久久| 成人免费午夜电影| 这里只有精品国产| 精品成人久久| 欧美日韩国产成人| 日韩一卡二卡在线观看| 国产精品午夜一区二区三区| 日韩高清免费观看| 婷婷激情综合五月天| av在线日韩| 色欧美片视频在线观看| 欧美黄色免费网址| av在线导航| 亚洲欧美一区二区三区极速播放| 日韩免费毛片| 邻居大乳一区二区三区| 久久影院电视剧免费观看| 国产午夜精品一区| 天堂在线中文网| 成人免费视频一区二区| 成人欧美一区二区三区视频| 国产黄a三级三级看三级| 精品一区二区日韩| 国产欧洲精品视频| 在线视频欧美亚洲| 日韩va欧美va亚洲va久久| 国产成人一区二区三区小说| 天天干天天操天天操| 亚洲综合五月| 久久99国产综合精品女同| 欧美亚洲精品日韩| av电影在线播放| 一区二区三区自拍视频| 日韩欧美国产一区二区在线播放 | 精品乱码一区二区三四区视频| 91网址在线看| 日本精品一区二区| 久久久久久久久久久久久女过产乱| 99国产精品免费视频观看| 欧美成人午夜影院| 久草手机在线观看| 久久精品国产免费| 99久热re在线精品996热视频 | 成人在线视频免费| 日韩免费看网站| 亚洲国产欧美视频| 日韩黄色大片网站| 高清一区二区三区四区五区| 亚洲av无码精品一区二区| 精品一区二区三区在线播放| 国产欧美日韩综合一区在线观看| 国产乱视频在线观看| 亚洲男人的天堂一区二区| 日本少妇高潮喷水视频| 在线播放成人| 精品视频久久久久久久| 成人在线观看高清| 国产日韩一区二区三区在线播放| 国产精品欧美日韩久久| 亚洲第一黄色片| 国产欧美日韩亚州综合 | 图片区小说区亚洲| 91黄视频在线观看| 亚洲最大视频网| 大色综合视频网站在线播放| 久久久欧美一区二区| 一区二区视频播放| 99久久久国产精品免费蜜臀| 亚洲a∨一区二区三区| 嗯啊主人调教在线播放视频| 欧美精品第1页| 日本韩国一区二区三区| 最新天堂中文在线| 日韩大胆成人| 欧美日韩第一页| 亚洲系列在线观看| 久久久久久麻豆| 天堂…中文在线最新版在线| 激情综合五月| 尤物精品国产第一福利三区| av黄色在线看| 成人午夜在线播放| 亚洲免费视频播放| 成人免费黄色| 国产一区二区黄| 六月丁香婷婷综合| 成人三级伦理片| 成年人深夜视频| 国产精品亚洲综合在线观看| 一区二区欧美激情| 成年人视频在线免费看| 91最新地址在线播放| 91免费国产精品| 国产一区二区三区免费观看在线| 中日韩午夜理伦电影免费 | 欧美日韩视频在线观看一区二区三区| 极品粉嫩小仙女高潮喷水久久| 激情久久久久久| 国产精品对白一区二区三区| 神马午夜伦理不卡| 精品久久久久久最新网址| 人妻少妇精品一区二区三区| 国产在线日韩欧美| 中文字幕免费高| 国产精品久久久久久久久久辛辛 | 91桃色在线| 亚洲大胆人体在线| 国产成人精品a视频一区| 成人avav影音| 黄色一级片播放| 亚欧日韩另类中文欧美| 国产成人福利视频| 国产无套粉嫩白浆在线2022年| 在线视频一区二区三区| 极品蜜桃臀肥臀-x88av| 看电视剧不卡顿的网站| 亚洲一一在线| 日本在线成人| 成人午夜私人影院| 日本中文字幕成人| 不卡在线视频| 91麻豆精品国产91久久久 | 亚洲国产婷婷综合在线精品| 香港三日本8a三级少妇三级99| 国产欧美欧美| 亚洲黄色成人久久久| 日韩久久99| 九九热精品视频| 天堂а√在线8种子蜜桃视频| 日韩欧美主播在线| 欧美巨胸大乳hitomi| 国产一区二区h| aa视频在线播放| 国产一区三区在线播放| 成人高h视频在线| 成人女同在线观看| 一个人看的www久久| www.av在线.com| 欧美午夜久久久| 美国黄色片视频| 成人黄色一级视频| 国产精品无码av无码| 久久久久久久久丰满| 国产日韩久久| 成人不卡视频| 欧美黄色小视频| 成人亚洲性情网站www在线观看| 91麻豆精品国产91久久久资源速度| 中文字幕第28页| 国产精品久久午夜| 日本xxxx裸体xxxx| 韩国v欧美v亚洲v日本v| 男人操女人逼免费视频| 欧美丰满老妇| 欧美美乳视频网站在线观看| 精品视频在线播放一区二区三区 | 成人黄色片在线观看| 亚洲午夜一区二区| 国产aaaaaaaaa| 91亚洲精品久久久蜜桃| 在线视频一二区| 日韩电影免费在线| 国产真人做爰毛片视频直播| 久久美女视频| 日韩欧美一区二区视频在线播放| 综合激情久久| 成人免费淫片aa视频免费| 午夜精品久久久久久久久久蜜桃| 欧美激情久久久久| 星空大象在线观看免费播放| 免费视频观看成人| 欧洲中文字幕国产精品| free性欧美hd另类精品| 尤物tv国产一区| 青青免费在线视频| 亚洲精品在线观| 国产av一区二区三区精品| 欧美又粗又大又爽| 中文字幕av影院| 午夜私人影院久久久久| 国产十六处破外女视频| 中文字幕欧美一区| www久久久久久久| 国产视频一区二区在线| 久久人人爽人人人人片| 福利一区福利二区| 特黄特黄一级片| 国产精品一区在线观看你懂的| 深夜黄色小视频| 蜜臀久久99精品久久久久久9 | 亚洲视频在线二区| 波多野结衣在线观看一区二区三区 | 97超碰人人模人人人爽人人爱| 欧美亚洲自拍偷拍| 波多野结衣理论片| 日本二三区不卡| www.日韩一区| 欧美日韩专区在线| 91成人国产综合久久精品| 欧美久久久久久蜜桃| 91麻豆视频在线观看| 91精品中文字幕一区二区三区| 国产一区二区三区黄片| 在线播放亚洲一区| 国产av一区二区三区精品| 欧美大片拔萝卜| 天堂中文在线资源| 日韩激情在线视频| 国产在线日本| 色999日韩欧美国产| 久草免费在线| 欧美精品videossex性护士| 草草视频在线观看| 日韩美女av在线免费观看| yiren22亚洲综合| 亚洲在线免费视频| 综合中文字幕| 99一区二区三区| 成人豆花视频| 国产精品一区二区av| 欧美成人午夜77777| 日韩av电影免费在线| 国产精品欧美在线观看| 日韩少妇中文字幕| 国产成人无码av| 久久夜色精品国产欧美乱极品| 中文字幕丰满孑伦无码专区| 久久久国产精品麻豆| 91成人精品一区二区| 亚洲激情网站免费观看| 久久综合激情网| 丰满岳妇乱一区二区三区| 这里只有精品9| 日韩欧美123| 天堂av2024| www.亚洲一区| 男男gaygays亚洲| 欧洲成人免费aa| 日韩毛片网站| 国产精品国产精品国产专区蜜臀ah | 一区二区自拍偷拍| 日韩美一区二区三区| 污视频在线免费| 亚洲欧美激情四射在线日| 成人在线影视| 2018日韩中文字幕| 91高清视频在线观看| 国产精品夜色7777狼人| 无码国模国产在线观看| 色播五月综合| 欧美黄色大片网站| 凹凸日日摸日日碰夜夜爽1| 国产精品资源在线| a级在线观看视频| 国产精品久久看| 丰满少妇xoxoxo视频| 欧美一区二区三区日韩视频| 天天操天天干天天舔| 欧美大片va欧美在线播放| 欧美大片1688| 91视频九色网站| 欧美一区二区三区激情视频| 精品一二三四五区| 久久国产尿小便嘘嘘| 成人在线电影网站| 国产精品国产自产拍在线| 97久久久久久久| 91精品国产手机| 天天干天天爽天天操| 国产一区二区av| 97超碰资源站在线观看| 国产精品久久久久一区二区 | 日本成人黄色| 午夜日韩电影| 日本在线观看视频一区| 久久影音资源网| 免费视频久久久| 精品福利一二区| 国产黄网站在线观看| 国产三级精品网站| 中文字幕亚洲影视| 日韩精品久久一区二区| 国产成人综合精品三级| 日韩一二区视频| 成人国产综合| 鲁鲁视频www一区二区| 日韩av密桃| 911福利视频| 国产欧美日韩综合精品一区二区| 久久亚洲精品石原莉奈| 日韩经典第一页| 成人爽a毛片免费啪啪动漫| 高清国产在线一区| 中文字幕一区二区三区久久网站| 久热精品在线观看视频| 久久久久久久久一| 久久久久亚洲av成人片| 欧美一区二区三区喷汁尤物| www.亚洲视频| 国产精品精品视频一区二区三区| 蜜桃国内精品久久久久软件9| 国产视频一视频二| av网站免费线看精品| 亚洲精品在线观看av| 亚洲电影免费观看高清完整版在线观看| 成人免费网址| 91牛牛免费视频| 91精品久久久久久久久久不卡| 婷婷丁香激情网| 国产精品理论片在线观看| 一区二区视频网| 国产小视频国产精品| 最新欧美电影| 国产一区再线| 国产亚洲高清视频| 蜜桃精品成人影片| 亚洲成人激情综合网| 老司机午夜福利视频| 欧美亚洲日本黄色| 九一亚洲精品| 国产裸体免费无遮挡| 欧美激情一二三区| 中文字幕日韩第一页| 久久成人精品视频| 麻豆精品久久| 日韩欧美视频网站| 久久精子c满五个校花| 中文字幕人妻丝袜乱一区三区| 欧美猛交ⅹxxx乱大交视频| 91亚洲无吗| av无码精品一区二区三区| 国产女人aaa级久久久级| 人妻中文字幕一区二区三区| 久久人体大胆视频| 福利在线一区| 亚洲精品怡红院| 国产精品国产三级国产普通话三级| 一区二区三区日| 欧美激情亚洲视频| 亚洲黄色录像| 亚洲丝袜在线观看| 精品国产91久久久久久| 欧洲不卡av| 国产精品一区视频网站| 欧美aⅴ一区二区三区视频| 欧美黑人性猛交xxx| 亚洲黄色av网站| 国产专区精品| 日韩欧美一区二| 亚洲欧美成人一区二区三区|