重要聲明:
故事純屬虛構,如有雷同請勿對號入座,故事只是為了拋磚引玉,雖以第一人稱和作者本人網名起但不代表本人真實想法,請勿把故事中人物和作者本人聯系起來,故事本意只為模式創造前提條件
劇情:
最近家裡剛剛裝上寬帶,那個高興啊,終於不用天天泡在網吧裡了,可是沒高興多長時間發現家裡鬧起了電腦慌,女朋友跟我強著上就一台電腦,還是本本沒辦法和女友合計買太電腦,但手頭不寬裕放棄了買品牌電腦,於是呼就轉悠了一圈組裝電腦大賣場。吼吼這裡什麼都有,自己想怎麼樣裝就怎麼樣裝。於是兩人坐到一店裡,服務員給我拿來了配置
1. 華塑的主板
2. DELL的機箱
3. 三星的顯示器
4. 不知名的2.0影響
(不全只是羅列一些)
選了一大通厚決定買了花了4500元錢,不一會服務員就把機器裝好了,交完錢把電腦扛回家這回沒有人再搶電腦了。
故事雖說簡單,但這裡卻能很好的描述我們今天所講的模式(生成器模式),我們來看下電腦這個類,他本身是由多個零部件組成的一個組成品,有主板啊,機箱啊等等他們都是獨立的個體,再一起組成了一個更強大的機器。而賣組裝電腦的點就像一個組裝廠一樣把各個零部件按順序的組合起來,並使電腦能正常的運行。
我們來看看我如何用OOD來描述
結構:
l Product (產品- Competor (電腦))包含了(主版-MainBoard、顯示器-Display、音響- Acoustics、光驅-ComboDVD)
l Director (ConputerDirector)
l Builder (ComputerDealer)
l ConcreteBuikder (DLLDealer、QIXIDealer)
判定這個OOD設計是否合理我們依據我們第二章的設計模式原則來判定
1. 是否符合開閉原則
封閉對組裝電腦的步驟,開放多種電腦的組裝。
答案:符合
2. 是否符合裡氏代換原則
我們在單獨主張一台DLL電腦的時候直接調用DLLDealer類即可,不需要調用他的抽象父類所以符合
答案:符合
3. 是否符合合成復用原則
電腦有多種硬件組成所以有些部件不可缺有些可以不要照樣工作,不如音響其他的是必不可缺的,他們都有自己的名稱價格等與生俱來的屬性。
答案:符合
4. 是否符合依賴倒置原則
從這個類調用來看創建一台電腦主要靠的是ComputerDealer這個抽象類,所以Builder依賴與ComputerDealer
答案:符合
5. 是否符合接口隔離原則
本模式沒有涉及到接口
答案:不涉及
6. 是否符合抽象原則
答案:符合
7. 是否符合迪米特法則
我們看到ComputerDealer只做組裝電腦,返回電腦類的工作所以符合。
答案:符合
總的來講這個OOD設計是符合設計模式的要求
總結 :生成器模式
意圖:
對一復雜對象的構造與他的表示分離,可使同樣的構造過程創建出不同的表示。
復雜對象----電腦
同樣的構造過程---都是用的同樣接口創建
創建出不同的表示---我們用DLLDealer、QIXIDealer創建出DLL電腦和QIXI電腦
動機:
在軟件系統中,當我們遇到一個復雜的對象是由多個獨立的類通過一定的算法構成,又由於需求的變化使各個部分不斷的變化(就像電腦中的顯示器我可以用三星純平的也可以用液晶的)組合後變成不同的同類型產品。但他們的組成算法通常是相對穩定的時候我們就可以用生成器模式
實用性:
l 一個系統要獨立於他的產品的創建、組合和表示時(即客戶不關心產品的生產過程只關心產品的使用是否合適)
l 一個系統要求多個產品系列中的一個來配置時(這個不難理解試想下Helen的要求就可以理解了)。
l 當你要強調一系列相關的產品對象的設計以便進行聯合使用時
l 當你提供一個產品類庫,只想顯示他們的接口而不是現實時(這個在軟件開發中相當重要,盡量減少軟件對外的接口可以更好的保護軟件的安全性)
適用性:
l 當創建的對象的算法應該獨立與該對象的組成部分以及他們的裝配方式時
l 當構造過程必須允許被構造的對象有不同的表示時
結構:
參與者:
l Product (產品- Competor (電腦))包含了(主版-MainBoard、顯示器-Display、音響- Acoustics、光驅-ComboDVD)
l Director (ConputerDirector)
l Builder (ComputerDealer)
l ConcreteBuikder (DLLDealer、QIXIDeal)
效果:
1. 可以是你任意改變產品部件的內部表示
2. 將構造代碼和表示代碼分開(可參見源代碼)
3. 更好的控制產品的構造過程