第3講 Abstract Factory抽象工廠模式

2023-01-24 23:24:02 字數 2489 閱讀 1343

2005.11.15 李建忠

new的問題

常規的物件建立方法:

new的問題:

-實現依賴,不能應對「具體例項化型別」的變化

解決思路:

-封裝變化點——**變化,封裝**

-潛台詞:如果沒有變化,當然不需要額外的封裝!

工廠模式的緣起

變化點在「物件建立」,因此就封裝「物件建立」

面向介面程式設計——依賴介面,而非依賴實現

最簡單的解決方法:

建立一系列相互依賴的物件

假設乙個遊戲開發場景:

我們需要構造「道路」、「房屋」、「地道」、「叢林」……等等物件

簡單工廠的問題

簡單工廠的問題:

-不能應對「不同系列物件」的變化。比如有不同風格的遊戲場景——對應不同風格的道路、房屋、地道……客戶程式相對穩定,但是靜態的簡單工廠卻可能成為變化點。

如何解決:

-使用物件導向的技術來「封裝」變化點

動機(motivation)

在軟體系統中,經常面臨著「一系列相互依賴的物件」的建立工作;同時,由於需求的變化,往往存在更多系列物件的建立工作。

如何應對這種變化?如何繞過常規的物件建立方法(new),提供一種「封裝機制」來避免客戶程式和這種「多系列具體物件建立工作」的緊耦合?

意圖(intent)

提供乙個介面,讓該介面負責建立一系列「相關或者相互依賴的物件」,無需指定它們具體的類。

——《設計模式》gof

結構(structure)

a1和b1是乙個系列,a2和b2是另乙個系列。concretefactory1是建立系列1的工廠方法,concretefactory2是建立系列2的工廠方法。客戶程式client只依賴了abstractfactory和abstractproducta、abstractproductb,也就是客戶程式不依賴於具體實現,而是只依賴與抽象類。

如果現在需要建立乙個系列3運用到客戶程式,我們只需要再寫乙個系列3的工廠,繼承自abstractfactory,這個工廠提供了2個實現:

createproducta();

createproductb();

它們分別返回producta3(繼承自abstractproducta)、productb3(繼承自abstractproductb)。

也就是說,如果新增了系列3,client程式可以完全不用改動,可能只需要該一些配置檔案,增加一些新dll就可以應對變化。

遊戲框架中的abstractfactory應用

這個例子裡,road就是abstractproducta1,building就是abstractproductb1,facilitiesfactory就是abstractfactory。

客戶程式

可以看出,客戶程式依賴的全部是抽象類,在客戶程式**中沒有出現過任何具體的實現類。因為在系列需要變化的時候,是不需要改變抽象類的,只是增加乙個抽象類的實現而已,又由於客戶程式只依賴於抽象,所以系列變化的時候客戶程式完全無需變化。

乙個現代風格系列的實現

具體現代風格系列工廠實現

應用到具體程式(現代風格)

應用到具體程式(經典風格)

可以看出,風格由modern改變為classic的時候,我們封裝好的gamemanager客戶程式沒有改變,這就是我們想要的結果。gamemanager的邏輯非常複雜,現在它的穩定,能夠大大方便我們的工作。

abstractfactory模式的幾個要點

1.如果沒有應對「多系列物件建立」的需求變化,則沒有必要使用abstractfactory模式,這時候使用簡單的靜態工廠完全可以。

2."系列物件"指的是這些物件之間有相互依賴、或作用的關係,例如遊戲開發場景中「道路」與「房屋」的依賴,「道路」與「地道」的依賴。

模式主要在於應對「新系列」的需求變動。其缺點在於難以應對「新物件」的需求變動。

模式經常喝factorymethod模式共同組合來應對「物件建立」的需求變化。

例如,如果是風格不是經常變化,而是其他內容變化(例如今天要新增道路的類、明天要新增沙漠的類),這樣用這種抽象工廠模式反而會把系統搞的很糟糕,因為抽象工廠類中的子類變化了,所有實現抽象工廠的類都需要去變化,重新實現,重新編譯和部署。

也就是說關鍵要看變化的方向和軸線在**。如果變化的軸線在多風格,那抽象工廠模式就很適用;如果變化的軸線在抽象工廠裡面的物件,就最好不要使用這種模式。

.net框架中的abstractfactory應用

在編譯的時候,首先把aspx頁面檔案先編譯成乙個類,然後再把codebehind又編譯成乙個類,codebehind的類繼承自page類,而aspx頁面的類又繼承自codebehind類。,但是這個運用更多是體現在業務層次。

builder模式和abstractfactory模式的區別

builder模式更強調的是物件部分的構建這樣乙個嚴格的過程,它構建的是整個物件的各個部分。它把構建穩定下來之後,各個部分在變化,最後組合成乙個整體的物件。

abstractfactory模式構建的是一組系列互動的物件。

互相依賴、互相互動的物件和乙個物件的各個部分是有區別的。

第3講遞推

遞推是一種應用非常廣泛的常用演算法之一,與下一章的遞迴有著密切的聯絡。本章 遞推在求解數列 數陣以及計數等應用案例方面的應用。在紛繁變幻的世界,所有事物都隨時間的流逝發生著微妙的變化。許多現象的變化是有規律可循的,這種規律往往呈現出前因後果的關係。某種現象的變化結果與緊靠它前面變化的乙個或一些結果緊...

第3章程序管理 第3講

作業系統 主講人 黃伯虎 上一講內容回顧 程序間的相互作用 基本概念 同步 互斥 臨界資源 臨界區帶來的問題 解決方案 鎖變數法 測試和設定指令 訊號量和p v操作 訊號量的物理含義 s 0 表示可用資源數目。s 0 表示沒有資源可用。s 0 其絕對值表示因為此訊號量而被阻塞的程序數。p ss為訊號...

第3講銷售管理

1資訊科技與商務管理系25 1企業資源規劃 erp 資訊科技與商務管理系25 2企業資源規劃 erp 主要內容銷售管理業務型別 資訊科技與商務管理系25 3企業資源規劃 erp 企業銷售管理的職能是在企業供需鏈中處於市場 客戶 與企業 製造 資訊科技與商務管理系25 5企業資源規劃 erp 銷售管理...