動機
《設計模式》引言中對於動機的說明如下:
用以說明乙個設計問題以及如何用模式中的類、物件來解決該問題的特定情景。該情景會幫助你理解隨後對模式更抽象的描述。
簡單地說:就是設計模式的應用例項。
回到抽象工廠模式的動機。
考慮乙個支援多種視感(look-and-feel)標準的使用者介面工具包,例如 motif和presentation manager。不同的視感風格為諸如滾動條、視窗和按鈕等使用者介面「視窗元件」定義不同的外觀和行為。為保證視感風格標準間的可移植性,乙個應用不應該 為乙個特定的視感外觀硬編碼它的視窗元件。在整個應用中例項化特定視感風格的視窗元件類將使得以後很難改變視感風格。
《設 計模式》成書很早,所以書中會出現許多過去的軟體和技術,例如上文moti和presentation manager。這裡建議大家不必過分在意這些名詞,能夠理解作者意圖即可。上面的文字中忽略例如的部分也不會有任何問題,只要能找到類似的場景就好,例 如linux作業系統的主題就是乙個不錯的例子。除了表示方式不同之外,動作方式也會有所不同。可以想象:如果將所有和主題相關的**都寫在乙個類裡,代 碼勢必會變得很複雜,最後的結果就是得無法維護和擴充套件。
為解決這一問題我們可以定義乙個抽象的 widgetfactory類,這個類宣告了乙個用來建立每一類基本視窗元件的介面。每一類視窗元件都有乙個抽象類,而具體子類則實現了視窗元件的特定視 感風格。對於每乙個抽象視窗元件類, wi dgetfactory介面都有乙個返回新視窗元件物件的操作。客戶呼叫這些操作以獲得視窗元件例項,但客戶並不知道他們正在使用的是哪些具體類。這樣客 戶就不依賴於一般的視感風格,如下頁圖所示。
每 一種視感標準都對應於乙個具體的 widgetfactory子類。每一子類實現那些用於建立合適視感風格的視窗元件的操作。例如, motifwidgetfactory的crea tescrollbar操作例項化並返回乙個motif滾動條,而相應的pmwidgetfactory操作返回乙個presentation manager的滾動條。客戶僅通過widgetfactory介面建立視窗元件,他們並不知道哪些類實現了特定視感風格的視窗元件。換言之,客戶僅與抽 象類定義的接**互,而不使用特定的具體類的介面。
面 向物件中解決這類一問題的方法只有乙個,就是利用多型,首先建立各種視窗組建的抽象類,然後在每種主題中為相應的組建準備具象類。上圖中的windows 和scrollbar就是視窗組建的抽象類,而pmwindow,motiwindow,pmsrollbar,motiscrollbar就是對應的具 象類。
對於視窗組建的利用者client來說,並不需要知道各個視窗組建的具象類,只有知道元件是某種window或者某種scrollbar即可。但是還有乙個問題:client在使用元件時雖然可以不知道元件具象類資訊,但構建元件的時候無論如何也沒有辦法繼續裝糊塗。
解決這個問題想法就是將構建視窗元件的部分封裝的到乙個類中。名字可以叫widgetfacroty,它根據主題資訊生成對應的視窗元件,壞事交給別人做。這就是簡單工廠模式。簡單工程模式依然不夠完美:因為當增加主題的時候,仍然需要對工廠類進行一定的修改。
終於到了主角出場的時候了。
這裡繼續請出物件導向的絕招:多型。我們可以準備乙個工廠的抽象類,然後為每種主題準備具象類。每種具象工廠類負責生成對應主題的視窗元件。在需要更換主題時,更換具象工廠類即可。
widgetfactory也增強了具體視窗元件類之間依賴關係。乙個 motif的滾動條應該與motif按鈕、motif正文編輯器一起使用,這一約束條件作為使用 motifwidgetfactory的結果被自動加上。
client得到視窗元件的方式只有通過指定的具象工廠類一種方式,這樣就從結果上決定了哪些具象視窗組建類一起協同工作。
作業題解答
前一篇文章的最後,留了乙個尾巴,關於依賴關係的畫法的。其實這本不應該乙個問題。因為物件導向的乙個基本原則就是降低耦合以增加可維護性和可擴充套件性,所以要盡量對抽象類程式設計,最好只和抽象類有單向的依賴關係。指向具象類的依賴雖然不能完全迴避,但這種關聯線最好只有一條。否則就很有可能是那種"長得就犯法「的設計。
注:
本文中藍色粗體文字都引自《設計模式》一書。
Aha!設計模式 2 抽象工廠 1
設計模式 的前兩章分別介紹設計模式的概要和乙個應用例項。對於乙個設計模式的初學者來講,應該不大好理解。我們直接進入具體的設計模式。本文從抽象工廠模式說起。名稱 在物件導向的世界裡,名稱具有很重要的含義。名稱一旦明確了,職責和行為差不多也就定了 反之如果沒有辦法為乙個類,方法命名,往往就是職責和行為不...
Aha!設計模式 5 抽象工廠 4
結構 下圖為抽象工廠模式的類圖。這個類圖和前面出現過的類圖唯一的區別就是使用了更加抽象的類名。所以就不在重複說明了。這裡說說另乙個話題 畫類圖。抽象工廠模式的類圖可以按照以下步驟 當然不是絕對的 畫出 首先可以個畫出三個工廠類。為每個工廠類新增兩個產生產品的操作 方法。畫出兩個產品系列的繼承結構。新...
Aha!設計模式 7 抽象工廠 6
實 現 下面是實現abstract factor模式的一些有用技術 1 將工廠作為單件 乙個應用中一般每個產品系列只需乙個concretefactory的例項。因此工廠通常最好實現為乙個singleton 3.5 只有一句話,但是並沒有給出實現。為了說明這個問題,作者按照自己的理解,以前面提到的作業...