最近在學習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>
調用一下我們所寫的方法,方法如下:
最好的效果圖如下:

好了,以上就是本人對於抽象工廠模式的微理解。希望你看完本文也對抽象模式有一個微理解。