工廠與泛型

2021-04-28 00:47:11 字數 1572 閱讀 9128

在採用三層架構進行開發的過程中,我們通常會用到工廠。在表示層中通過它來建立不同的業務例項,再

去呼叫方法。假設我們專案中存已下幾層:業務介面層,業務層(實現實務介面),業務工廠層,資料訪

問層,通用方法層,表示層等。如果業務很多,我們定義了很多的不同的介面,在不用泛型的業務工廠類

["dal"];  

#region createcategory

///

/// 建立product資料層介面

///

public static maticsoft.idal.products.icategory createcategory()

#endregion

#region createproduct

///

/// 建立product資料層介面

///

public static maticsoft.idal.products.iproduct createproduct()

#endregion

.....

在這種方式下隨著業務介面的增多,我們將在這裡逐步增加對應的方法。

有沒有一種方式能夠實現在業務增多時,不改工廠的結構。

我的做法是這樣的:通過泛型來實現。工廠裡只需乙個方法。既然

例如:public  static t createinstance()

string sa_assembclass = (string)

maticsoft.common.globalvariable.classrelation[s_name];

string s_assemblypath = sa_assembclass[0];

string s_classname = sa_assembclass[1];

object obj = assembly.load(s_assemblypath).createinstance(s_assemblypath

+"."+ s_classname);

return (t) obj;

}既然我們在呼叫此方法的時候只是傳入乙個對應的介面型別,那麼如何得到需要實際建立的業務物件呢?

畢竟我們是不能直接例項化乙個介面的。也就是如何得到介面與業務的程式集,以及具體的類之間的關係

,以便我們通過反射來建立具體的物件呢。這時我們可以將這三者的關係儲存在乙個xml檔案或資料庫表

中。例如:

介面1的fullname  /對應實現介面1的業務的程式集名稱  /業務類的名稱

maticsoft.idal.products.iproduct /maticsoft.bll.products /products

在我們的工廠方法裡通過得到應的業務的介面全名,我們就可以得到其他兩項,我上面採用的是存在資料

庫表中,查出來後存在通用層的雜湊表中,鍵為fullname,值為乙個陣列string[2].以靜態變數的方法存

在通用層中,這樣就可以避免得復去查資料庫中的表。得到值後再通過反射既可建立例項了某介面的物件

例項。個人感覺很方便,下次再增加業務時,不需要改這個業務工廠了,只需往表中或xml檔案中插入紀

錄就行。

也許你還有更好的方法。

集合和泛型11 泛型委託與泛型事件

委託也可以泛型化,也就是委託也定義自己的型別引數,這樣的委託稱為泛型委託。在使用委託的 中可以給委託指定型別引數的具體型別,而讓泛型委託例項化為具體的委託例項。就像例項化泛型類或呼叫泛型方法一樣。定義乙個泛型委託的語法格式 public private protected delegate 返回型別...

泛型List與非泛型ArrayList

arraylist集合的用處越來越窄了,list static void main string args arraylist的不安全性一目了然,型別不安全,必將導致各種攻擊的產生,static void main string args 相比不安全的arraylist來說,list 的型別安全性使...

泛型 泛型類 泛型方法 泛型擦除

1 是什麼?一種允許我們在不確定引數型別時候使用的型別。例如我不知道a方法應該會傳string還是int,我就用個泛型先佔坑。2 為什麼要用泛型?泛型可以在編譯期自動確定具體型別,檢查型別是否匹配,可以提高 的重用率,減少冗餘編碼。3 泛型與object的區別?像上面說的我不知道方法a的引數型別,其...