1. 程式人生 > >設計模式go語言實現----三類工廠模式

設計模式go語言實現----三類工廠模式

本文主要講解設計模式中的三類工廠模式:

  • 簡單工廠模式(Simple Factory Pattern)
  • 工廠方法模式(Factory Method Pattern)
  • 抽象工廠模式(Abstract Factory Pattern)

1 簡單工廠模式

在這裡插入圖片描述 圖例分析: 考慮一個簡單的應用場景,這個應用場景可以提供很多形狀(比如圖中的Circle、Square、Rectangle),它們都源於一個Shape介面(也可以理解為基類),Circle、Square、Rectangle都實現了此介面。

go 語言沒有建構函式一說,所以一般會定義NewXXX函式來初始化相關類。 NewXXX 函式返回介面時就是簡單工廠模式,也就是說Golang的一般推薦做法就是簡單工廠。

2 工廠方法模式

工廠方法模式:定義一個用於建立物件的介面,讓子類決定例項化那一個類,工廠方法使一個類的例項化延遲到其子類。 在這裡插入圖片描述 圖例說明: 定義了兩個介面Shape和ShapeFactory,Circle、Square、Rectangle和CircleFactory、SquareFactory、RetcangleFactory分別實現了Shape和ShapeFactory介面。Demo中建立了ShapeFactory介面,讓CircleFactory、SquareFactory、RetcangleFactory決定去例項化哪類Shape。

優點:

  1. 在工廠方法模式中,工廠方法用來建立客戶所需要的產品,同時還向客戶隱藏了哪種具體產品類將被例項化這一細節,使用者只需要關心所需產品對應的工廠,無須關心建立細節,甚至無須知道具體產品類的類名。
  2. 基於工廠角色和產品角色的多型性設計是工廠方法模式的關鍵。它能夠使工廠可以自主確定建立何種產品物件,而如何建立這個物件的細節則完全封裝在具體工廠內部。工廠方法模式之所以又被稱為多型工廠模式,是因為所有的具體工廠類都具有同一抽象父類。
  3. 使用工廠方法模式的另一個優點是在系統中加入新產品時,無須修改抽象工廠和抽象產品提供的介面,無須修改客戶端,也無須修改其他的具體工廠和具體產品,而只要新增一個具體工廠和具體產品就可以了。這樣,系統的可擴充套件性也就變得非常好,完全符合“開閉原則”。

缺點:

  1. 在新增新產品時,需要編寫新的具體產品類,而且還要提供與之對應的具體工廠類,系統中類的個數將成對增加,在一定程度上增加了系統的複雜度,有更多的類需要編譯和執行,會給系統帶來一些額外的開銷。
  2. 由於考慮到系統的可擴充套件性,需要引入抽象層,在客戶端程式碼中均使用抽象層進行定義,增加了系統的抽象性和理解難度。

3 抽象工廠模式

抽象工廠模式:提供一個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。 在這裡插入圖片描述 圖例說明:

定義了三個介面Television、Fridge、Factory,XiaoMiTelevision、HaiErTelevision和XiaoMiFridge、HaiErFridge以及XiaoMiFactory、HaiErFactory分別實現了它們。Demo中定義了Factory,使用XiaoMiFactory、HaiErFactory分別生產Television或Fridge。

為了更清晰地理解工廠方法模式和抽象工廠模式的區別,需要引入兩個概念:

  • 產品等級結構:不同品牌的同一類產品,比如電視機,其子類有海爾電視機、TCL電視機等,電視機與具體品牌的電視機之間就構成了一個產品等級結構。
  • 產品族:是指同一個工廠生產的,位於不同產品等級結構中的一組產品。比如海爾電器廠生產的海爾電視機、海爾電冰箱等。海爾電視機位於電視機產品等級結構中,海爾電冰箱位於電冰箱產品等級結構中。

因此可以總結為以下幾點:

  • 當系統所提供的工廠所需生產的具體產品並不是一個簡單的物件,而是多個位於不同產品等級結構中屬於不同型別的具體產品時需要使用抽象工廠模式。
  • 抽象工廠模式是所有形式的工廠模式中最為抽象和最具一般性的一種形態。
  • 抽象工廠模式與工廠方法模式最大的區別在於,工廠方法模式針對的是一個產品等級結構,而抽象工廠模式則需要面對多個產品等級結構,一個工廠等級結構可以負責多個不同產品等級結構中的產品物件的建立 。當一個工廠等級結構可以創建出分屬於不同產品等級結構的一個產品族中的所有物件時,抽象工廠模式比工廠方法模式更為簡單、有效率。