一個實例搞懂抽象工廠模式

關於工廠模式三兄弟(簡單工廠、工廠方法、抽象工廠),前兩個兄弟比較容易懂,基本一看就明白,第三位兄弟初看起來確實有些抽象,網上看到一個例子講的很好,分享給大家,保證一看就明白。

文末給出系列文章出處。

Sunny軟件公司欲開發一套界面皮膚庫,可以對Java桌面軟件進行界面美化。為了保護版權,該皮膚庫源代碼不打算公開,而只向用戶提供已打包為jar文件的class字節碼文件。用戶在使用時可以通過菜單來選擇皮膚,不同的皮膚將提供視覺效果不同的按鈕、文本框、組合框等界面元素,其結構示意圖如圖所示:

一個實例搞懂抽象工廠模式

界面皮膚庫結構示意圖


該皮膚庫需要具備良好的靈活性和可擴展性,用戶可以自由選擇不同的皮膚,開發人員可以在不修改既有代碼的基礎上增加新的皮膚。

Sunny軟件公司的開發人員針對上述要求,決定使用工廠方法模式進行系統的設計,為了保證系統的靈活性和可擴展性,提供一系列具體工廠來創建按鈕、文本框、組合框等界面元素,客戶端針對抽象工廠編程,初始結構如圖所示:

一個實例搞懂抽象工廠模式

基於工廠方法模式的界面皮膚庫初始結構圖

在上圖中,提供了大量工廠來創建具體的界面組件,可以通過配置文件更換具體界面組件從而改變界面風格。但是,此設計方案存在如下問題:

(1) 當需要增加新的皮膚時,雖然不要修改現有代碼,但是需要增加大量類,針對每一個新增具體組件都需要增加一個具體工廠,類的個數成對增加,這無疑會導致系統越來越龐大,增加系統的維護成本和運行開銷;

(2) 由於同一種風格的具體界面組件通常要一起顯示,因此需要為每個組件都選擇一個具體工廠,用戶在使用時必須逐個進行設置,如果某個具體工廠選擇失誤將會導致界面顯示混亂,雖然我們可以適當增加一些約束語句,但客戶端代碼和配置文件都較為複雜。

如何減少系統中類的個數並保證客戶端每次始終只使用某一種風格的具體界面組件?這是Sunny公司開發人員所面臨的兩個問題,顯然,工廠方法模式無法解決這兩個問題,彆著急,本文所介紹的抽象工廠模式可以讓這些問題迎刃而解。

Sunny公司開發人員使用

抽象工廠模式來重構界面皮膚庫的設計,其基本結構如圖所示:

一個實例搞懂抽象工廠模式

如果需要更換皮膚,只需修改配置文件即可,在實際環境中,我們可以提供可視化界面,例如菜單或者窗口來修改配置文件,用戶無須直接修改配置文件。如果需要增加新的皮膚,只需增加一族新的具體組件並對應提供一個新的具體工廠,修改配置文件即可使用新的皮膚,原有代碼無須修改,符合“開閉原則”。

擴展

在真實項目開發中,我們通常會為配置文件提供一個可視化的編輯界面,類似Struts框架中的struts.xml編輯器,大家可以自行開發一個簡單的圖形化工具來修改配置文件,實現真正的純界面操作。

本文並沒有展開講抽象工廠模式的方方面面,只是用一個例子,讓大家對這個設計模式有個直觀的感受,讓它“落地”到實例中,建議大家看看下面的系列文章(認真看用不了多久),我也是從這裡摘取的例子。

以下為文章參考出處: 《工廠三兄弟之抽象工廠模式》

  • https://github.com/quanke/design-pattern-java/blob/master/%E5%B7%A5%E5%8E%82%E4%B8%89%E5%85%84%E5%BC%9F%E4%B9%8B%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F%EF%BC%88%E4%B8%80%EF%BC%89.md
  • https://github.com/quanke/design-pattern-java/blob/master/%E5%B7%A5%E5%8E%82%E4%B8%89%E5%85%84%E5%BC%9F%E4%B9%8B%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F%EF%BC%88%E4%BA%8C%EF%BC%89.md
  • https://github.com/quanke/design-pattern-java/blob/master/%E5%B7%A5%E5%8E%82%E4%B8%89%E5%85%84%E5%BC%9F%E4%B9%8B%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F%EF%BC%88%E4%B8%89%EF%BC%89.md
  • https://github.com/quanke/design-pattern-java/blob/master/%E5%B7%A5%E5%8E%82%E4%B8%89%E5%85%84%E5%BC%9F%E4%B9%8B%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F%EF%BC%88%E5%9B%9B%EF%BC%89.md
  • https://github.com/quanke/design-pattern-java/blob/master/%E5%B7%A5%E5%8E%82%E4%B8%89%E5%85%84%E5%BC%9F%E4%B9%8B%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F%EF%BC%88%E4%BA%94%EF%BC%89.md


分享到:


相關文章: