Golang 工廠模式

1_CdjOgfolLt_GNJYBzI-1QQ.jpeg

簡單工廠模式

簡單工廠模式(Simple Factory Pattern) :定義一個工廠類,它可以根據參數的不同返回不同類的實例,被創建的實例通常都具有共同的父類。因為在簡單工廠模式中用于創建實例的方法是靜態(static)方法,因此簡單工廠模式又被稱為靜態工廠方法(Static Factory Method)模式,它屬于類創建型模式。

簡單工廠需要:

  • 工廠結構體
  • 產品接口
  • 產品結構體

示例說明

創建一個餃子店工廠結構體,和餃子類的接口。該工廠的其中一個方法用來生產不同口味的餃子,如韭菜的豬肉餡的。

type DumplingsShop struct{
    Generate(t string) *Dumplings
}


type Dumplingsinterface interface {
    create()
}

創建肉餡和韭菜餡的餃子結構體,并且實現對應接口的方法。

  type DumplingsMeat struct{}

  func (* DumplingsMeat)create(){
      fmt.Println("DumplingsMeat create")
  }

  type DumplingsChives struct{}

  func (* DumplingsChives)create(){
      fmt.Println("DumplingsMeat create")
  }

func(* DumplingsShop)Create(type string)*Dumplings{
    switch type {
        case "meat":
        return new(DumplingsMeat)
        case "chives":
        return new(DumplingsChives)
        default:
        return nil
    }
}

工廠實例化調用

var type string
dumplingFactory := DumplingsShop{}
type = "meat"
meat := dumplingFactory.Create(type)//返回肉餡餃子對象
meat.create()
type = "chives"
chives := dumplingFactory.Create(type) //返回韭菜餡餃子對象
chives.create()

簡單工廠模式優缺點

  • 優點: 工廠類是整個工廠模式的核心,我們只需要傳入給定的信息,就可以創建所需實例,在多人協作的時候,無需知道對象之間的內部依賴,可以直接創建,有利于整個軟件體系結構的優化。

  • 缺點: 工廠類中包含了所有實例的創建邏輯,一旦這個工廠類出現問題,所有實例都會受到影響,并且,工廠類中生產的產品都基于一個共同的接口,一旦要添加不同種類的產品,這就會增加工廠類的復雜度,將不同種類的產品混合在一起,違背了單一職責,系統的靈活性和可維護性都會降低,并且當新增產品的時候,必須要修改工廠類,違背了『系統對擴展開放,對修改關閉』的原則。

工廠方法模式

工廠方法模式(英語:Factory method pattern) 是一種實現了“工廠”概念的面向對象設計模式。就像其他創建型模式一樣,它也是處理在不指定對象具體類型的情況下創建對象的問題。工廠方法模式的實質是“定義一個創建對象的接口,但讓實現這個接口的類來決定實例化哪個類。工廠方法讓類的實例化推遲到子類中進行。”,實際應用中工廠方法模式針對的是一個產品等級結構。

工廠方法需要:

  • 工廠接口
  • 工廠結構體
  • 產品接口
  • 產品結構體

示例說明

創建一個餃子店工廠接口,和餃子類的接口。該工廠用來生產不同口味的餃子,如韭菜的豬肉餡的。

type DumplingsShopinterface interface{
    Generate(t string) *Dumplings
}

type Dumplingsinterface interface {
    create()
}

創建北京和西安對應餡的餃子結構體,并且實現對應接口的方法。

  type BeijingDumplingsMeat struct{}

  func (* BeijingDumplingsMeat)create(){
      fmt.Println("BeijingDumplingsMeat create")
  }

  type BeijingDumplingsChives struct{}
  ...
  type XianDumplingsMeat struct{}
  ...
  type XianDumplingsChives struct{}
  ...

創建北京和西安工廠

type BeijingDumplings struct{}
type XianDumplings struct{}

func(* BeijingDumplings)Generate(t string) *Dumplings{
    switch t { 
    case "chives" :
    return new(BeijingDumplingsChives) 
    case "meat" :
    return new(BeijingDumplingsMeat) 
    default:
    return nil
    }
}

func(* XianDumplings)Generate(t string) *Dumplings{
    switch t{}
    case "chives" :
    return new(XianDumplingsChives) 
    case "meat" :
    return new(XianDumplingsMeat) 
    default:
    return nil
}

工廠實例化調用

  var DumplingsShopFactory DumplingsShopinterface
  DumplingsShopFactory := new(BeijingDumplings)
  b = DumplingsShopFactory.Generate("meat")  // 傳入肉餡的參數,會返回北京市的肉餡餃子
  b.create()

  DumplingsShopFactory := new(XianDumplings)
  b = DumplingsShopFactory.Generate("meat") // 同樣傳入肉餡的參數,會返回北京市的肉餡餃子
  b.create()

工廠方法模式的優缺點

  • 優點: 符合“開閉”原則,具有很強的的擴展性、彈性和可維護性。修改時只需要添加對應的工廠類即可使用了依賴倒置原則,依賴抽象而不是具體,使用(客戶)和實現(具體類)松耦合。客戶只需要知道所需產品的具體工廠,而無須知道具體工廠的創建產品的過程,甚至不需要知道具體產品的類名。

  • 缺點: 每增加一個產品時,都需要一個具體類和一個具體創建者,使得類的個數成倍增加,導致系統類數目過多,復雜性增加對簡單工廠,增加功能修改的是工廠類;對工廠方法,增加功能修改的是產品類。

抽象工廠模式

抽象工廠模式(英語:Abstract factory pattern) 是一種軟件開發設計模式。抽象工廠模式提供了一種方式,可以將一組具有同一主題的單獨的工廠封裝起來。在正常使用中,客戶端程序需要創建抽象工廠的具體實現,然后使用抽象工廠作為接口來創建這一主題的具體對象。客戶端程序不需要知道(或關心)它從這些內部的工廠方法中獲得對象的具體類型,因為客戶端程序僅使用這些對象的通用接口。抽象工廠模式將一組對象的實現細節與他們的一般使用分離開來。實際應用中針對的多個產品等級結構。

示例說明

創建一個肉餡餃子店工廠接口和韭菜餡餃子店工廠接口,以及餃子類的接口。

type DumplingsShopinterface interface{
    GenerateMeatDumpling() *Dumplingsinterface
    GenerateChivesDumpling() *Dumplingsinterface
}

type Dumplingsinterface interface {
    create()
}

實現北京肉餡餃子、北京韭菜餃子、西安肉餡餃子、西安韭菜餃子4中實例對象。

  type BeijingDumplingsMeat struct{}

  func (* BeijingDumplingsMeat)create(){
      fmt.Println("BeijingDumplingsMeat create")
  }

  type BeijingDumplingsChives struct{}
  ...
  type XianDumplingsMeat struct{}
  ...
  type XianDumplingsChives struct{}
  ...

創建北京和西安工廠

type BeijingDumplingsFactory struct{}
type XianDumplingsFactory struct{}

func(* BeijingDumplingsFactory)GenerateMeatDumpling() *Dumplings{
    return new(BeijingDumplingsMeat) 
    }
}
func(* BeijingDumplingsFactory)GenerateChivesDumpling() *Dumplings{
    return new(BeijingDumplingsChives) 
    }
}

func(* XianDumplingsFactory)GenerateMeatDumpling() *Dumplings{
    return new(XianDumplingsMeat) 
    }
}
func(* XianDumplingsFactory)GenerateChivesDumpling() *Dumplings{
    return new(XianDumplingsChives) 
    }
}

工廠示例調用

  var DumplingsShopFactory DumplingsShopinterface
  DumplingsShopFactory := new(BeijingDumplingsFactory)
  b = DumplingsShopFactory.GenerateMeatDumpling()  // 傳入肉餡的參數,會返回北京市的肉餡餃子
  b.create()
  ...

抽象工廠模式的優缺點

  • 優點: 抽象工廠模式除了具有工廠方法模式的優點外,最主要的優點就是可以在類的內部對產品族進行約束。所謂的產品族,一般或多或少的都存在一定的關聯,抽象工廠模式就可以在類內部對產品族的關聯關系進行定義和描述,而不必專門引入一個新的類來進行管理。

  • 缺點: 產品族的擴展將是一件十分費力的事情,假如產品族中需要增加一個新的產品,則幾乎所有的工廠類都需要進行修改。所以使用抽象工廠模式時,對產品等級結構的劃分是非常重要的

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374