在項目的開發過程中,在設計模式的概念還沒有出來時,我們那時候在編寫程序時,往往如果項目的數據庫是采用SQL Server,然後用戶又想換其它數據庫如Oracle時,我們就需要對其代碼進行重寫,特別是在一些軟件的產品化道路中,我們做出來的產品如果讓用戶可以有選擇的去選取各種數據庫,那無疑對用戶提供了很大的方便。
自從工廠模式的設計理念出來以後,這一切實現就變得容易得多,如果大家對微軟的PETSHOP有研究的話,那就不會陌生了,從PETSHOP3.0開始,微軟就開始采用了多數據庫操作系統的應用。數據工廠主要是通過把數據庫的連接做成一個抽象的工廠,如命名DALFactory,程序中所有的數據庫連接都通過這個工廠類來產生,用來負責根據配置文件動態創建系統所需的數據訪問邏輯對象。
我們就拿PETSHOP來舉例說明,PETSHOP在安裝的時候,會提示我們選擇什麼數據庫,如根據顯示的是SQL Server數據庫還是Oracle數據庫,可以得到Web.config的節點中的
<add key=" WebDAL " value=" PetShop.SQLServerDAL "/>
<add key=" OrdersDAL " value=" PetShop.SQLServerDAL "/>
或者是
<add key=" WebDAL " value=" PetShop.OracleDAL "/>
<add key=" OrdersDAL " value=" PetShop. OracleDAL "/>
然後在DALFactory項目的DataAccess類中調用數據庫的連接,代碼如下:
private static readonly string path = ConfigurationManager.AppSettings["WebDAL"];
然後再看下面的代碼:
public static PetShop.IDAL.ICategory CreateCategory() {
string className = path + ".Category";
return (PetShop.IDAL.ICategory)Assembly.Load(path).CreateInstance(className);
}
如我們使用的是SQL Server,那麼string className = path + ".Category"返回的就是PetShop.SQLServerDAL. Category,然後再用Assembly.Load加載PetShop.SQLServerDAL.DLL,同時創建PetShop.SQLServerDAL.Category的實例,並以接口(PetShop.IDAL.ICategory)類型返回。這樣業務邏輯層BLL調用ICategory接口時就會用PetShop.SQLServerDAL.Category類的實現代碼。
這時候用戶就不需要知道後台使用的到底是哪一種數據庫,它只要調用接口就行了,在接口中定義了要使用的方法,當調用接口時會根據具體的情況再去調用底層數據訪問操作。而現在這個DALFactory就是關鍵,當業務邏輯層要操作數據庫時,DALFactory會根據具體情況再去使用生成的程序集SQLServerDAL或者OracleDAL中的一個,這樣做的好處是對於業務邏輯層及WEB頁面層的程序不會因為底層數據訪問的程序變動而受到影響,因為只需要在業務邏輯層中調用接口就行了。
有可能有人會提,我同樣在工廠類裡面提供下面的方法去實現調用數據庫:
public static readonly DALFactory dalFa;
string webDal = ConfigurationManager.AppSettings["WebDAL"];
switch (webDal)
{
case "SQLServerDAL":
dalFa = new SqlServerDALFactory();
break;
case "OracleDAL":
dalFa = new OracleDALFactory();
break;
default:
dalFa = new SqlServerDALFactory();
break;
}
而這個時候如果我們增加了新的數據庫訪問方式,就必須得修改此部分的程序,然後再重新進行編譯部署,而同樣利用反射的機制去實現的時候,我們舉個例子如果系統中現在需要增加MySQL數據庫的時候,我們來看看它的代碼的可擴展性,我們可以比較PETSHOP中的SQLServerDAL下面的Category.cs文件和OracleDAL下面的Category.cs文件的代碼可知道,因為它們都繼承了ICategory接口,所以類實現的方法都相同,這時候我們只需要增加一個MySqlDAL項目,其下面的Category.cs文件也同樣遵循ICategory接口的方法,這時候我們再去修改為
這個時候都不需要重新對項目進行編譯,只需要增加MySqlDAL.DLL文件就可,無論增加多少數據庫,都是一件很簡單的操作,數據工廠操作多數據的優點就明顯可見。
<add key=" WebDAL " value=" PetShop.SQLServerDAL "/>為<add key=" WebDAL " value=" PetShop.MySqlDAL "/>