給了我們怎樣的設計思路小A:“建立型模式抽象了物件例項化的過程,它幫助系統不依賴於物件如何建立,如何實現,何時建立。個類建立型模式使用繼承使物件建立多樣化,一個物件建立模式將物件的建立代理到其他類。那抽象工廠模式是為了解決什麼問題的呢?會給我們怎樣的設計思路?師兄。”
大B:“軟體開發中我們經常會碰到一系列相關的物件需要建立,如果按照常規做法我們就要為不同的物件建立編寫不同的程式碼,複用性和可維護性都降低了。而且這些相關物件建立的方式也許不同,那麼客戶程式碼建立的時候就要針對不同的物件編碼,物件建立的方式還是一個容易改變的地方。基於這樣的情況提出了抽象工廠模式,抽象工廠模式為建立一系列相關物件提供了統一的介面,客戶只要呼叫這個介面即可,封裝了變化,隔離了變化,讓客戶程式碼穩定起來。 比如這樣一個情況,我們做了一個桌面軟體,這個軟體的介面是可以改變的,它有幾種風格:XP風格、Win2000風格、蘋果機風格。這個軟體就是顯示一個視窗,視窗有標題欄、捲軸,XP風格的介面有它自己的標題欄和捲軸,而蘋果機風格的又不一樣。”
大B:“我們常常這樣做?”
switch(type)
{
case“XP”:
setTitle(newXPTitle());
setScrollbar(newXPScrollbar());
break;
case“win2000”:
setTitle(newwin2000Title());
setScrollbar(newwin2000Scrollbar());
break;
case“macos”:
setTitle(newmacosTitle());
setScrollbar(newmacosScrollbar());
break;
}
小A:“這樣做有什麼壞處呢?”
大B:“這個例子太小實際上沒有什麼壞處,這樣寫可以。但是人總會出錯,你看看下面這個。”
case“win2000”:
setTitle(newwin2000Title());
setScrollbar(newXPScrollbar());
break;
大B:“你的介面將是Win2000的標題欄,XP風格的捲軸,這就造成了不一致性抽象工廠就是為了解決這種一系列相關物件建立工作的。)抽象工廠的類圖。”
大B:“在上面這個例子中標題欄和捲軸都是我們的產品,我們還應該寫一個WindowManager類,專門來管理這些產品的建立的,而我們的WinXP團隊、Win2000團隊、蘋果機團隊實現這個WindowManager,WinXP團隊只會製造出XP風格的產品。”