golang設計模式之抽象工廠模式

silsuer在掘金發表於2019-03-02

抽象工廠模式

簡介

wiki: 抽象工廠模式(英語:Abstract factory pattern)是一種軟體開發設計模式。抽象工廠模式提供了一種方式,可以將一組具有同一主題的單獨的工廠封裝起來。在正常使用中,客戶端程式需要建立抽象工廠的具體實現,然後使用抽象工廠作為介面來建立這一主題的具體物件。客戶端程式不需要知道(或關心)它從這些內部的工廠方法中獲得物件的具體型別,因為客戶端程式僅使用這些物件的通用介面。抽象工廠模式將一組物件的實現細節與他們的一般使用分離開來。

在前面的文章中我們介紹過工廠模式的前兩種:

而今天要介紹的 抽象工廠模式 就是工廠模式中的最後一種了,是前兩種模式的補充,

工廠模式用來建立一組相關或者相互依賴的物件,與工廠方法模式的區別就在於,工廠方法模式針對的是一個產品等級結構;而抽象工廠模式則是針對的多個產品等級結構,
我們可以將一種產品等級想象為一個產品族,所謂的產品族,是指位於不同產品等級結構中功能相關聯的產品組成的家族。

程式碼實現

還是以 工廠方法模式 中我們舉的賣包子的例子:

在之前的工廠方法中,需要在齊市和廣東開兩家包子店,那麼就需要從一個工廠介面中實現兩個工廠結構體,齊市店和廣東店屬於兩個產品族,豬肉包和三鮮餡包子屬於同一個等級結構,

所以在抽象工廠模式中,我們要新增兩個工廠,每個工廠實現兩個產品的建立方法:

  1. 工廠介面和產品介面

       type FactoryInterface interface {
       	CreatePigMeatBuns() ProductInterface // 建立豬肉餡產品
       	Create3SBuns() ProductInterface      // 建立三鮮餡產品
       }
       
       type ProductInterface interface {
       	Intro()
       }
    複製程式碼
  2. 實現4種產品

   
  type GDPigMeatBuns struct {
  }

  func (p GDPigMeatBuns) Intro() {
      fmt.Println("廣東豬肉餡包子")
  }
  // TODO ... 其他產品實現方法沒區別... 就省略掉了,需要的話請去倉庫裡看原始碼
複製程式碼
  1. 實現工廠
  // 齊市包子鋪 
  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{}
  }
複製程式碼
  1. 這樣就可以通過抽象工廠建立了

         var f FactoryInterface  // 特意以這種方式宣告,更好的體會抽象工廠模式的好處
       	f = new(QSFactory)  
       	b := f.CreatePigMeatBuns()  
       	b.Intro()
    複製程式碼

優缺點

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

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

總結

現在我們就講完了三種工廠模式的構建了,他們之間有區別又有聯絡,具體使用什麼模式,就見仁見智了,經常性的,當業務發展過程中,會從簡單工廠模式一步一步變成工廠方法,或者抽象工廠模式

建立型設計模式的結果都是得到指定物件,模式之間沒有好壞,按需使用,只要能夠達到解耦的目的,就是好模式。

上述程式碼均放在 golang-design-patterns 這個倉庫中

打個廣告,推薦一下自己寫的 go web框架 bingo,求star,求PR ~

相關文章