程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#設計模式之抽象工廠模式新解(7)

C#設計模式之抽象工廠模式新解(7)

編輯:關於C語言

不錯,我們解決了一個大問題,設想一下:當該系統從中國企業移植到美國企業時,我們現在需要做什麼?

答案是: 對於Caculator類我們什麼也不用做。我們需要做的是修改Factory類,修改結果如下:

1using System;
2
3namespace FactorySalary
4{
5 /**//// <summary>
6 /// Factory類
7 /// </summary>
8 public class Factory
9 {
10 public Tax CreateTax()
11 {
12 return new AmericanTax();
13 }
14
15 public Bonus CreateBonus()
16 {
17 return new AmericanBonus();
18 }
19 }
20}
21

為系統增加抽象工廠方法

很顯然,前面的解決方案帶來了一個副作用:就是系統不但增加了新的類Factory,而且當系統移植時,移植工作僅僅是轉移到Factory類上,工作量並沒有任何縮減,而且還是要修改系統的源碼。從Factory類在系統移植時修改的內容我們可以看出: 實際上它是專屬於美國企業或者中國企業的。名稱上應該叫AmericanFactory,ChineseFactory更合適.

解決方案是增加一個抽象工廠類AbstractFactory,增加一個靜態方法,該方法根據一個配置文件(App.config或者Web.config) 一個項(比如factoryName)動態地判斷應該實例化哪個工廠類,這樣,我們就把移植工作轉移到了對配置文件的修改。修改後的模型和代碼:

抽象工廠類的代碼如下:

1using System;
2using System.Reflection;
3
4namespace AbstractFactory
5{
6 /**//// <summary>
7 /// AbstractFactory類
8 /// </summary>
9 public abstract class AbstractFactory
10 {
11 public static AbstractFactory GetInstance()
12 {
13 string factoryName = Constant.STR_FACTORYNAME.ToString();
14
15 AbstractFactory instance;
16
17 if(factoryName == "ChineseFactory")
18 instance = new ChineseFactory();
19 else if(factoryName == "AmericanFactory")
20 instance = new AmericanFactory();
21 else
22 instance = null;
23
24 return instance;
25 }
26
27 public abstract Tax CreateTax();
28
29 public abstract Bonus CreateBonus();
30 }
31}

配置文件:

1<?XML version="1.0" encoding="utf-8" ?>
2<configuration>
3 <aPPSettings>
4 <add key="factoryName" value="AmericanFactory"></add>
5 </aPPSettings>
6</configuration>
7

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved