前言:
因爲第一版機房重構是一個功能就需要對應一個工廠,所以我個人覺得工廠的代碼重複率高也不需要怎麼多個工廠。雖然第一版有想法但是沒有實現思路,所以就先這樣用着。到後面這幾版逐漸的有思路了,而且對機房重構也比較清晰了。所以有想法很重要,目前能不能實現(不是很重要)!
優化前的代碼:
/// <summary>
/// 登錄工廠
/// </summary>
public class LoginFactory
{
//獲取配置文件
string StrDB = System.Configuration.ConfigurationManager.AppSettings["DB"];
//應用反射獲得DAL層操作,來返回D層的登錄查詢類。
public LoginIDAL CreateUser()
{
string ClassName = StrDB + "." + "LoginDal";
return (LoginIDAL)Assembly.Load(StrDB).CreateInstance(ClassName);
}
}
大家可以腦補下,每一個功能都需要一個對應的工廠。機房收費系統有多少功能,得用多少工廠? 這個問題大家一思考是不是覺得特別可怕。 而且代碼重複率高達百分之九十,甚至還多。
上面這張圖片裏除了我畫紅圈的地方以外,剩下的代碼都是重複代碼。大家可以和下面這個優化完之後的代碼做一個對比,效果很明顯。
優化後的代碼:
//獲取配置文件,要實例化的程序集名稱。
string StrDB = System.Configuration.ConfigurationManager.AppSettings["DB"];
/// <summary>
///應用反射獲得DAL層操作,來返回D層的登錄查詢類。
///缺點:數據類型是死的,不同數據類型的工廠調用需要在調用處強制轉換。
/// </summary>
/// <param name="CreatClassName">要實例化的類</param>
/// <returns>d層具體查詢</returns>
public object CreateUser(string CreatClassName)
{
//具體要實例化的類
string ClassName = StrDB + "." +CreatClassName;
//利用反射返回要實例化的具體類
return (object)Assembly.Load(StrDB).CreateInstance(ClassName);
}
優化之後的代碼裏,把上面寫死的那個具體要創建的對象改成了參數。這樣就可以根據傳不同的參數,來實例化不同的對象。也減少了很多重複性的代碼。
BLL層調用:
//利用反射,實例化D層登錄查詢類
LoginIDAL idal = (LoginIDAL)fact.CreateUser("LoginDal");
調用代碼就是在原來的基礎上機加個參數,和進行下類型轉換。(註釋:因爲默認工廠類型是object類型)