最近在學習MVC,對於MVC裡面的一些項目上的東西都和抽象模式有關,今天就微說明一下個人對於抽象工廠模式的理解,以方便學習MVC及工廠模式相關的同事和博友們理解。不足之處,還請斧正!
首先簡單闡述一些三層的關系,相信觀看該文章的博友們對於三層設計早已經是爛熟於心了,我這邊就簡單說明一下:
用戶界面表示層(Web)
業務邏輯層(BLL)
數據訪問層(DAL)
1:數據數據訪問層:主要是對原始數據(數據庫或者文本文件等存放數據的形式)的操作層,而不是指原始數據,也就是說,是對數據的操作,而不是數據庫,具體為業務邏輯層或表示層提供數據服務.
2:業務邏輯層:主要是針對具體的問題的操作,也可以理解成對數據層的操作,對數據業務邏輯處理,如果說數據層是積木,那邏輯層就是對這些積木的搭建。
3:表示層:主要表示WEB方式,也可以表示成WINFORM方式,WEB方式也可以表現成:aspx, 如果邏輯層相當強大和完善,無論表現層如何定義和更改,邏輯層都能完善地提供服務。
下面闡述一些抽象工廠模式的作用,請看圖(該圖為我一個老師所畫,在這裡給大家簡單看一下)
OK,言歸正傳,我們來跟著項目做一個抽象工廠模式的demo
下面新建一個解決方案:如下圖:
他們之間的描述及引用關系如下:
AXCModel層:實體類層
AXCDAL層:數據訪問層
IAXCDAL層:數據訪問層接口
AXCFactoryDAL層:數據訪問工廠設計
AXCBLL層:業務邏輯層
IAXCBLL層:業務邏輯層接口
AXCFactory層:業務邏輯層工廠設計
AXCWeb層:表現層
接口之間的引用關系如下:
IAXCDAL層和IAXCBLL層引用AXCModel層
AXCDAL層引用IAXCDAL層和AXCModel層
AXCBLL層引用AXCFactoryDAL層和IAXCBLL層和IAXCDAL層和AXCModel層
工廠之間的引用:
AXCFactoryDAL層引用AXCDAL層和IAXCDAL層
AXCFactory層引用AXCBLL層和IAXCBLL層
表現層引用:
AXCWeb層引用AXCFactory層和IAXCBLL層和AXCModel層
下面我們就以一個簡單的獲取記錄條數為功能實現抽象工廠模式:
在AXCModel層裡面新建一個PeopleModel類,屬性(自動屬性)如下:
public class PeopleModel { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public bool Sex { get; set; } }
在IAXCDAL層裡面新建一個IPeopleDAL類,該類裡面的內容是AXCDAL數據訪問層裡面的接口方法,如下:
public interface IPeopleDAL { List<AXCModel.PeopleModel> getPeopleList(); }
在AXCDAL層裡面新建一個PeopleDAL類,繼承IPeopleDAL類,該類裡面的內容是IAXCDAL層裡的具體的方法的實現,如下(由於沒有設計數據庫,暫時手動代替一下):
public class PeopleDAL:IAXCDAL.IPeopleDAL { public List<AXCModel.PeopleModel> getPeopleList() { List<AXCModel.PeopleModel> People = new List<AXCModel.PeopleModel>(){ new AXCModel.PeopleModel(){ Id=1,Name="艾新草",Age=25,Sex=false}, new AXCModel.PeopleModel(){ Id=2,Name="艾新草1",Age=23,Sex=true}, new AXCModel.PeopleModel(){ Id=3,Name="艾新草2",Age=22,Sex=false} }; return People; } }
查看本欄目
在AXCFactoryDAL層裡新建一個抽象類:AbsFactoryDAL,該類實現了讀取配置文件中的配置的數據訪問層,方便實現支持多數據庫開發,如下,
public abstract class AbsFactoryDAL { /// <summary> /// 根據配置文件 獲取 實體數據工廠 對象 /// </summary> /// <returns></returns> public static AbsFactoryDAL GetFatory() { string strType = System.Configuration.ConfigurationManager.AppSettings["dalType"].ToString(); AbsFactoryDAL dalFactory = null; switch (strType) { case "dal": dalFactory = new DALFatory(); break; } return dalFactory; } public abstract IAXCDAL.IPeopleDAL GetPeople(); }
在新建一個DALFatory類,該類繼承了AbsFactoryDAL,返回一個具體的數據訪問層實例,如下:
public class DALFatory : AbsFactoryDAL { public override IAXCDAL.IPeopleDAL GetPeople() { return new AXCDAL.PeopleDAL(); } }
在IAXCBLL層裡面新建一個IPeopleBLL類,該類裡面的內容是AXCBLL業務邏輯層裡面的接口方法,如下:
public interface IPeopleBLL { List<AXCModel.PeopleModel> getPeopleList(); }
在AXCBLL層裡面新建一個PeopleBLL類,繼承IPeopleBLL類,該類裡面的內容是IAXCBLL層裡的具體的方法的業務實現,如下:
public class PeopleBLL:IAXCBLL.IPeopleBLL { // IAXCDAL.IPeopleDAL IPeopleDal =null; /// <summary> /// 數據抽象工廠 - 由抽象工廠類的 靜態方法創建 : 父類 obj = new 子類(); /// </summary> AXCFactoryDAL.AbsFactoryDAL absFactoryDAL = AXCFactoryDAL.AbsFactoryDAL.GetFatory(); public List<AXCModel.PeopleModel> getPeopleList() { IAXCDAL.IPeopleDAL IPeopleDal = absFactoryDAL.GetPeople(); return IPeopleDal.getPeopleList(); } }
與在AXCFactoryDAL層裡新建工廠差不多,在AXCFactory層裡新建一個抽象類:AbsFactoryBLL,該類實現了讀取配置文件中的配置的業務邏輯層,方便實現支持多數據庫開發多個業務邏輯層,如下,
/// <summary> /// 根據配置文件 獲取 實體業務工廠 對象 /// </summary> /// <returns></returns> public static AbsFactoryBLL GetFatory() { string strType = System.Configuration.ConfigurationManager.AppSettings["bllType"].ToString(); AbsFactoryBLL bllFactory = null; switch (strType) { case "bll": bllFactory = new BLLFatory(); break; } return bllFactory; } public abstract IAXCBLL.IPeopleBLL GetPeople(); }
在新建一個BLLFatory類,該類繼承了AbsFactoryBLL,返回一個具體的業務邏輯層實例,如下:
public class BLLFatory :AbsFactoryBLL { public override IAXCBLL.IPeopleBLL GetPeople() { return new AXCBLL.PeopleBLL(); } }
好了,基礎的工作我們已經完成的差不多了,現在就在web層裡配置一下webconfig文件,如下:
<appSettings>
<add key="bllType" value="bll"/>
<add key="dalType" value="dal"/>
</appSettings>
調用一下我們所寫的方法,方法如下:
最好的效果圖如下:
好了,以上就是本人對於抽象工廠模式的微理解。希望你看完本文也對抽象模式有一個微理解。