1. 程式人生 > >23中設計模式之抽象工廠模式

23中設計模式之抽象工廠模式

抽象工廠模式的定義

定義: 為建立一組相關或互相依賴的物件提供一個介面,而且無須制定它們的具體類

抽象工廠模式的實現

兩個產品族, 其類圖如下:

23中設計模式之抽象工廠模式

 

抽象產品類程式碼如下:

23中設計模式之抽象工廠模式

 

產品A的1級和2級類程式碼如下:

23中設計模式之抽象工廠模式

 

產品B與產品A類似

抽象工廠類 AbstractCreator 的職責是定義 每個工廠要實現的功能,其程式碼如下:

23中設計模式之抽象工廠模式

 

如何建立產品,則是由具體的實現類來完成的, Creator1 和 Creator2程式碼如下:

23中設計模式之抽象工廠模式

 

這樣在使用時,我們只要知道它的工廠方法就可以直接產生一個產品物件,無需關心它的實現類

抽象工廠模式的優缺點

優點如下;

  1. 封裝性,每個產品的實現類不是高層模組要關心的,他只要關心介面、抽象,不關心物件是如何建立的. 如何建立由工廠負責.
  2. 產品族內的約束為非公開狀態. 抽象工廠模式應該有一個約束, 每生產一個A產品,同時生產2個B產品, 這樣的生產過程對呼叫工廠類的高層模組來說是透明的, 高層模組不需要知道這個約束, 只要給出一個具體的產品即可

缺點如下:

  1. 產品族擴充套件非常困難.例如,要增加一個產品, 抽象工廠類要增加一個方法, 其所有實現類都要增加方法, 這嚴重違反了開閉原則. 修改之後, 只要與這段程式碼有關係,就有可能產生影響

注意: 我們說抽象工廠模式的產品族擴充套件比較困難,但是產品等級擴充套件是非常容易的, 增加一個產品等級, 只要增加一個工廠類負責新增加出來的產品生產任務即可.

抽象工廠模式的使用場景

一個物件族(或是一組沒有任何關係的物件)都有相同的約束,則可以使用抽象工廠模式.

例如一個文字編輯器和一個圖片處理器, 都是軟體實體, 但是Unix下的文字編輯器和Windows下的文字編輯器雖然功能和介面都相同,但是程式碼實現是不同的,圖片處理器也有類似情況. 也就是具有了共同的約束條件: 作業系統. 於是我們可以使用抽象工廠模式, 產生不同作業系統下的編輯器和圖片處理器


抽象工廠模式是一個簡單的模式,使用的場景非常多,在軟體產品生產過程中,涉及不同作業系統的時候,都可以考慮使用抽象工廠模式, 例如一個應用, 需要在三個不同平臺(Windows, Linux, Android)上執行, 就可以通過抽象工廠模式遮蔽掉作業系統對應用的影響. 三個不同作業系統上的軟體功能、應用邏輯、UI都應該是非常類似的, 唯一不同的是呼叫不同的工廠方法,由不同的產品類去處理與作業系統互動的資訊


 

 

可以關注一下鄙人的公眾號, 謝謝各位了!