梁紅碩, 張玉松
(石家莊職業(yè)技術學院 信息工程系,河北 石家莊 050081)
在數(shù)據(jù)庫管理系統(tǒng)開發(fā)中,三層體系架構設計模式是目前最通用的設計模式.分層結構的設計離不開設計模式的靈活應用,而設計模式一方面可以使系統(tǒng)開發(fā)者方便地復用成功的設計和體系結構,同時也使人更容易理解其設計思路.簡單工廠模式是較簡單也較常用的一種設計模式.本文主要探討簡單工廠模式在三層架構管理系統(tǒng)中的應用.
簡單工廠模式(Simple Factory)也稱為靜態(tài)工廠模式(Static Factory Method),屬于類的創(chuàng)建型模式.在該模式中,“消費者”提供信息給“工廠”,“工廠”根據(jù)“產(chǎn)品樣式”生產(chǎn)出符合要求的“產(chǎn)品”[1].其中,“產(chǎn)品樣式”是指“抽象商品”,也即基類或接口;“產(chǎn)品”是指“具體產(chǎn)品”,也即對象.簡單工廠模式的實質就是有一個工廠類,它能根據(jù)傳入?yún)?shù)的不同,動態(tài)決定創(chuàng)建哪個類的實例,而這些類均來自同一個父類或接口[2].該模式中包含的角色及職責如圖1所示.
圖1 簡單工廠模式層次示意圖
(1)工廠(Creator)角色
該類是簡單工廠模式的核心,負責創(chuàng)建所有實例的內部邏輯.通過應用工廠類,可以封裝商品的創(chuàng)建過程.
(2)抽象(Product)角色
簡單工廠模式創(chuàng)建的所有對象的父類可以被看作具體產(chǎn)品的樣式,它提供具體產(chǎn)品的主要規(guī)格.
(3)具體產(chǎn)品(Concrete Product)角色
利用簡單工廠模式創(chuàng)建的所有目標對象,均可以認為是工廠創(chuàng)建的產(chǎn)品,可以提供給消費者使用.
目前典型的三層架構自底向上依次為:數(shù)據(jù)訪問層、業(yè)務邏輯層和表示層.其中,數(shù)據(jù)訪問層負責與SqlServer,Access等數(shù)據(jù)源交互,即進行數(shù)據(jù)的插入、修改、刪除、查詢以及從數(shù)據(jù)庫中讀取數(shù)據(jù)等操作,為實現(xiàn)業(yè)務邏輯提供數(shù)據(jù)庫訪問基礎.業(yè)務邏輯層負責系統(tǒng)領域業(yè)務的處理,調用數(shù)據(jù)訪問層,并力求滿足表示層中每個邏輯功能的需求.表示層需要針對用戶的需求,為每個功能模塊部署相應的輸入控件、操作控件、輸出控件及調用業(yè)務邏輯層的相關方法,以實現(xiàn)與用戶的輸入、輸出交互[3].
以三層學生選課管理系統(tǒng)為例,應用簡單工廠模式,能夠使該系統(tǒng)適用于多種數(shù)據(jù)庫系統(tǒng),如SqlServer,Access,Oracle,MySQL等.要訪問不同的數(shù)據(jù)庫管理系統(tǒng),需要設計相應的數(shù)據(jù)訪問層.在本文中分別設計了AceessDAL和SQLServerDAL兩個數(shù)據(jù)訪問層,以完成對Access數(shù)據(jù)庫和SQLServer數(shù)據(jù)庫的訪問,這兩個項目屬于簡單工廠模式中的具體產(chǎn)品角色.同時,設計了一個訪問各個類的接口項目IDAL(數(shù)據(jù)訪問接口),它包含以上兩個數(shù)據(jù)訪問層項目的所有數(shù)據(jù),此項目即為簡單工廠模式中的抽象角色.還設計了一個工廠類DALFactory,它根據(jù)輸入?yún)?shù)的不同,決定生成哪個數(shù)據(jù)訪問類的對象,此項目屬于簡單工廠模式中的工廠角色.應用簡單工廠模式設計的系統(tǒng)體系架構如圖2所示.
圖2 應用簡單工廠模式的系統(tǒng)體系架構圖
2.2.1 設計IDAL
接口是用來定義多個類時都必須具備的,方式不同實現(xiàn)的功能也不同.IDAL接口中應定義AcceessDAL和SQLServerDAL兩個類中都具備的方法.在DAL層,對數(shù)據(jù)庫中的每張表設計一個類,以完成對數(shù)據(jù)的增加、刪除、修改、查詢等基本操作.因此,在IDAL中,對應DAL中的每個類均設計有一個接口,包含對其所有方法的定義,如圖3所示.
其中,ICourseAccess(學生選課管理系統(tǒng))接口的代碼如下:
List<Course> GetCourseList();///獲取課程列表
List<Course> GetCourse(string courseId);///獲取某課程信息列表
bool Exist(string courseId);/// 根據(jù)課程號判斷此課程是否存在
int AddCourse(Course course);///應用課程對象添加課程
int DelCourse(string courseId);///根據(jù)課程號刪除課程
Course GetCourseModel(string courseId);///根據(jù)課程編號獲取課程對象
圖3 IDAL設計
2.2.2 設計工廠類DALFactory
工廠類要根據(jù)輸入的參數(shù)決定生成哪個數(shù)據(jù)訪問類的對象.其中,數(shù)據(jù)庫的參數(shù)信息需要放在配置文件中,工廠類從配置文件中讀取信息,獲取參數(shù).如果應用Access數(shù)據(jù)庫,則需要在配置文件中添加如下信息:
<appSettings>
<?。斍笆褂玫臄?shù)據(jù)庫系統(tǒng)Access/SqlServer-->
<add key="CurrentDBSystem"value="access"/>
</appSettings>
接下來需要在工廠類中設計靜態(tài)方法以對應接口中的相應方法,并根據(jù)不同參數(shù)值創(chuàng)建相應數(shù)據(jù)訪問類的對象.具體代碼如下:
public static ICourseAccess CreatCourseAccess()
{
ICourseAccess courseAccess=null;
switch(currenDBSystem)
{
case"access":
courseAccess=new CourceManage_3.
AccessDAL.CourseAccess();
break;
case"sqlserver":
courseAccess=new CourceManage_
3.SQLServerDAL.CourseAccess();
break;
}
return courseAccess;
}
2.2.3 業(yè)務邏輯層實現(xiàn)
業(yè)務邏輯層調用數(shù)據(jù)層時,只需要調用工廠類的CreatCourseAccess()方法,創(chuàng)建當前數(shù)據(jù)庫系統(tǒng)所需要的數(shù)據(jù)訪問類對象,屏蔽底層業(yè)務.業(yè)務邏輯層并不知道數(shù)據(jù)對象是由哪個數(shù)據(jù)訪問類創(chuàng)建的,即不論采用哪種數(shù)據(jù)庫,對業(yè)務邏輯層、表示層均沒有任何影響.
實現(xiàn)代碼為:
ICourseAccess courAccess=classDALFactory.CreatCourseAccess().
基于簡單工廠模式的三層體系架構,能降低模塊間的耦合性,更好地實現(xiàn)軟件的復用.它具有健壯性好、拓展性強和可移植性好的特點,能有效降低系統(tǒng)的建設和維護成本,并適應業(yè)務不斷變化和更新的需求,符合大型商業(yè)軟件的開發(fā)規(guī)范.
[1]段海清.基于NET平臺的分層架構與設計模式的設計與實現(xiàn)[D].成都:電子科技大學,2013.
[2]馬相芬.在三層結構中使用抽象工廠設計模式 [J].內江科技,2011(4):127.
[3]賈延明,張永濤.抽象工廠設計模式在MIS中的應用 [J].計算機系統(tǒng)應用,2011,20(1):205-207.