在軟體系統中,經常面臨著「一系列相互依賴的物件」的建立工作;同時由於需求的變化,往往存在著更多系列物件的建立工作。如何應對這種變化?如何繞過常規的物件的建立方法(new),提供一種「封裝機制」來避免客戶程式和這種「多系列具體物件建立工作」的緊耦合?這就是我們要說的抽象工廠模式。
意圖
提供乙個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。
模型圖
邏輯模型:
物理模型:
生活中的例子
抽象工廠的目的是要提供乙個建立一系列相關或相互依賴物件的介面,而不需要指定它們具體的類。這種模式可以汽車製造廠所使用的金屬沖壓裝置中找到。這種沖壓裝置可以製造汽車車身部件。同樣的機械用於沖壓不同的車型的右邊車門、左邊車門、右前擋泥板、左前擋泥板和引擎罩等等。通過使用轉輪來改變沖壓盤,這個機械產生的具體類可以在三分鐘內改變。
抽象工廠之新解
虛擬案例
中國企業需要一項簡單的財務計算:每月月底,財務人員要計算員工的工資。
員工的工資 = (基本工資 + 獎金 - 個人所得稅)。這是乙個放之四海皆準的運算法則。
為了簡化系統,我們假設員工基本工資總是4000美金。
中國企業獎金和個人所得稅的計算規則是:
獎金 = 基本工資(4000) * 10%
個人所得稅 = (基本工資 + 獎金) * 40%
我們現在要為此構建乙個軟體系統(代號叫softo),滿足中國企業的需求。
案例分析
獎金(bonus)、個人所得稅(tax)的計算是softo系統的業務規則(service)。
工資的計算(calculator)則呼叫業務規則(service)來計算員工的實際工資。
工資的計算作為業務規則的前端(或者客戶端client)將提供給最終使用該系統的使用者(財務人員)使用。
針對中國企業為系統建模
根據上面的分析,為softo系統建模如下:
則業務規則service類的**如下:
1using system;
23namespace chinesesalary
412}
1using system;
23namespace chinesesalary
414 }
15}16
客戶端的呼叫**:
1using system;
23namespace chinesesalary
414 }
15}16
執行程式,輸入的結果如下:
chinese salary is:2640
針對美國企業為系統建模
為了拓展國際市場,我們要把該系統移植給美國公司使用。 美國企業的工資計算同樣是: 員工的工資 = 基本工資 + 獎金 - 個人所得稅。
但是他們的獎金和個人所得稅的計算規則不同於中國企業:
美國企業獎金和個人所得稅的計算規則是:
獎金 = 基本工資 * 15 %
個人所得稅 = (基本工資 * 5% + 獎金 * 25%)
根據前面為中國企業建模經驗,我們僅僅將chinesetax、chinesebonus修改為americantax、americanbonus。 修改後的模型如下:
則業務規則service類的**如下:
1using system;
23namespace americansalary
412}
131using system;
23namespace americansalary
414 }
15}16
1using system;
23namespace americansalary
414 }
15}16
客戶端的呼叫**:
12using system;
34namespace americansalary
524 }
25}26
執行程式,輸入的結果如下:
american salary is:2640
整合成通用系統
讓我們回顧一下該系統的發展歷程:
最初,我們只考慮將softo系統執行於中國企業。但隨著maxdo公司業務向海外拓展, maxdo需要將該系統移植給美國使用。
移植時,maxdo不得不拋棄中國企業的業務規則類chinesetax和chinesebonus, 然後為美國企業新建兩個業務規則類: americantax,americanbonus。最後修改了業務規則呼叫calculator類。
結果我們發現:每當softo系統移植的時候,就拋棄原來的類。現在,如果中國聯想集團要購買該系統,我們不得不再次拋棄americantax,americanbonus,修改回原來的業務規則。
乙個可以立即想到的做法就是在系統中保留所有業務規則模型,即保留中國和美國企業工資運算規則。
通過保留中國企業和美國企業的業務規則模型,如果該系統在美國企業和中國企業之間切換時,我們僅僅需要修改caculator類即可。
本文**
about:blank
C 設計模式程式設計之抽象工廠模式新解
概述 在軟體系統中,經常面臨著 一系列相互依賴的物件 的建立工作 同時由於需求的變化,往往存在著更多系列物件的建立工作。如何應對這種變化?如何繞過常規的物件的建立方法 new 提供一種 封裝機制 來避免客戶程式和這種 多系列具體物件建立工作 的緊耦合?這就是我們要說的抽象工廠模式。意圖 提供乙個建立...
C 設計模式程式設計之抽象工廠模式新解 1
概述 在軟體系統中,經常面臨著 一系列相互依賴的物件 的建立工作 同時由於需求的變化,往往存在著更多系列物件的建立工作。如何應對這種變化?如何繞過常規的物件的建立方法 new 提供一種 封裝機制 來避免客戶程式和這種 多系列具體物件建立工作 的緊耦合?這就是我們要說的抽象工廠模式。意圖 提供乙個建立...
C 設計模式程式設計之抽象工廠模式新解 2
抽象工廠之新解 虛擬案例 中國企業需要一項簡單的財務計算 每月月底,財務人員要計算員工的工資。員工的工資 基本工資 獎金 個人所得稅 這是乙個放之四海皆準的運算法則。為了簡化系統,我們假設員工基本工資總是4000美金。中國企業獎金和個人所得稅的計算規則是 獎金 基本工資 4000 10 個人所得稅 ...