徐 宏
(太原城市職業(yè)技術(shù)學院,山西 太原 030027)
利用案例教學法由淺入深地講解抽象工廠模式
徐 宏
(太原城市職業(yè)技術(shù)學院,山西 太原 030027)
文章主要闡述了抽象工廠模式,通過利用案例教學法進行講解,讓學員徹底理解并會使用抽象工廠設計模式。
抽象工廠模式;案例教學法;講解
抽象工廠模式是所有形態(tài)的工廠模式中最為抽象和最具一般性的一種形態(tài)。抽象工廠模式是指當有多個抽象角色時,使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個接口,使客戶端在不必指定產(chǎn)品的具體的情況下,創(chuàng)建多個產(chǎn)品族中的產(chǎn)品對象。根據(jù)LSP原則,任何接受父類型的地方,都應當能夠接受子類型。因此,實際上系統(tǒng)所需要的,僅僅是類型與這些抽象產(chǎn)品角色相同的一些實例,而不是這些抽象產(chǎn)品的實例。換言之,也就是這些抽象產(chǎn)品的具體子類的實例。工廠類負責創(chuàng)建抽象產(chǎn)品的具體子類的實例。
學生在利用該設計模式開發(fā)項目的時候,往往只是機械地照搬教師的源代碼,并沒有真正理解抽象工廠的含義。那么如何講解好這個知識點呢?在實際的授課過程中,筆者總結(jié)了講解這個難點的方法和技巧,總結(jié)出來與大家共享。
這里,筆者采用了案例教學法,層層深入,大約需要3個階段把這個難點講解完成。具體的思路是:首先,讓學員明白引入接口的原因;其次,講解使用簡單工廠的便利;最后,講解使用抽象工廠是錦上添花。
文章所使用的案例是一個用VS2008開發(fā)的用戶登錄程序。
第一階段:講解接口的引入,為什么要使用接口呢?這里需要跟學生說明,目前的軟件產(chǎn)品大部分都會和數(shù)據(jù)庫進行交互,但每個公司或企業(yè)不可能使用同樣的數(shù)據(jù)庫。例如,一個工資管理系統(tǒng),大公司可能使用SQLServer,而小公司可能使用Access就夠用了,那么如何讓一套程序既可使用SQLServer,又可使用Access作為數(shù)據(jù)庫呢?答案是我們在數(shù)據(jù)訪問層使用統(tǒng)一的接口,讓訪問SQLServer和Access的類都實現(xiàn)這個接口,然后通過接口調(diào)用具體的實現(xiàn)。
具體的演示方法是在用戶登錄系統(tǒng)的基礎上點擊DAL層的類,右鍵選擇重構(gòu),選擇提取接口,這樣一個接口就出現(xiàn)了,見圖1。
這里為了更加的規(guī)范,新建一個接口層的類庫IDAL,將這個接口移到這個類庫IDAL中,見圖2。
接口建立以后,為了可以使用Access庫,添加新的數(shù)據(jù)層AccessDAL,再添加一個AccessUserDAL類并實現(xiàn)剛才創(chuàng)建的接口。最后修改BLL層的調(diào)用方式為接口調(diào)用,用接口隱示的聲明,用類顯示的實現(xiàn)調(diào)用,對于訪問SQLServer數(shù)據(jù)庫具體的代碼是:

圖2 ISqlUserDAL dal=new Demo.DAL.SqlUserDAL();
如果需要訪問Access庫,稍加改動就變成訪問Access庫,具體代碼是:
ISqlUserDAL dal=new Demo.AccessDAL.AccessUserDAL();
第二階段:首先給學生提出問題:接口就可以實現(xiàn)訪問不同的數(shù)據(jù)庫我們?yōu)槭裁床捎霉S模式呢?原因有兩個:第一是客戶提出新需求,自己不改變源碼就更換為其他數(shù)據(jù)庫;第二是從開發(fā)公司考慮,為了適應不同的數(shù)據(jù)庫,每次需要修改BLL層源代碼,再編譯程序,發(fā)布程序比較麻煩。那么具體實現(xiàn)步驟是創(chuàng)建新的工廠項目類,添加類SFactory,然后在類中實現(xiàn)返回實現(xiàn)產(chǎn)品接口的方法,具體代碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Demo.SFactory
{
public class Factory
{
static string strDBType=
System.Configuration.ConfigurationManager.AppSettings["DBType"].ToString();
public static Demo.DAL.IUserDALCreatUserInfo()
{switch(strDBType)
{ case"sqlServer":
return new Demo.DAL.UserDAL();
break;
case "Access":
return new Demo.AccessDAL.UserAccessDAL();
break;
default:
return null;
}
}
}
}
通過Web.Config讀取配置數(shù)據(jù),針對不同數(shù)據(jù)庫,返回不同實現(xiàn)接口的對象,最后修改BLL層的調(diào)用方式為簡單工廠調(diào)用,用接口隱示聲明,但是實現(xiàn)通過工廠創(chuàng)建,代碼如下:
privatestatic IUserInfodb=SFactory.CreateDalUserInfoInstance();
配置文件App.Config代碼如下:
="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:Three-FrameDemoUIDemoUIinDebugAccessDb.mdb"/> 這樣我們就可以通過修改配置文件實現(xiàn)不同數(shù)據(jù)庫的訪問,實現(xiàn)了簡單工廠的設計模式。 第三階段:講解抽象工廠的實現(xiàn),有了簡單工廠,為什么還要使用抽象工廠呢,原因是一個大的軟件項目中包括很多的模塊,不同的模塊就要創(chuàng)建不同的接口,那么如何返回很多實現(xiàn)接口的對象呢,在簡單工廠模式中只能編寫多塊相似的代碼,通過判斷數(shù)據(jù)庫的類型返回具體的對象,這樣就造成大量的代碼冗余。這里采用優(yōu)化的方法,即抽象公共的部分,通過抽象類調(diào)用具體的實現(xiàn)類,可以產(chǎn)生一批有關聯(lián)的產(chǎn)品,例如通過配置文件讀取是Access數(shù)據(jù)庫類型,那么得到是Access的工廠,工廠里的產(chǎn)品都是通過訪問Access數(shù)據(jù)庫數(shù)據(jù)產(chǎn)生的產(chǎn)品。可以說對于簡單工廠模式一次只能創(chuàng)建一個對象,而對于抽象工廠模式實現(xiàn)一次創(chuàng)建一系列相互依賴對象的需求。 具體的演示實現(xiàn)步驟是首先通過修改前面的編寫的簡單工廠SFactory類為抽象工廠類,添加相應的抽象方法,通過讀取對應的配置文件,返回實現(xiàn)抽象類的工廠;然后創(chuàng)建一個具體工廠類SQLFactory繼承這個抽象工廠類,重寫抽象方法,只返回具體SQLServer庫的實現(xiàn);最后創(chuàng)建新的Access具體工廠類,添加類AccessFactory,讓它也繼承抽象工廠類,重寫抽象方法。另外,不要忘記修改BLL層的調(diào)用方式為抽象工廠調(diào)用,具體的代碼是先得到一個工廠,然后再得到相應產(chǎn)品。具體的代碼是: private static AbsDALFactory factory=AbsDALFactory.Choose-Factory(); private static IUserInfo db=factory.CreateDalUserInfoInstance(); 這樣我們就將數(shù)據(jù)訪問層的內(nèi)容進行了細化,首先引入接口,再使用簡單工廠,然后引入抽象工廠模式,通過演示讓學員明白為什么要使用簡單工廠和抽象工廠以及如何使用它。具體思路見圖3。 圖3 使用簡單工廠和抽象工廠的具體思路 這里演示完成后,如果學生還無法透徹地理解抽象工廠模式,下面共享一個生活案例給大家,通過案例剖析抽象工廠的實現(xiàn)方式: 圖4 抽象工廠 客戶是什么?這里我們說的客戶是指調(diào)用者,具體而言如網(wǎng)站的美工設計人員。那么地圖是什么呢?指配置文件,快餐點比喻我們的抽象工廠,漢堡和雞腿比喻抽象產(chǎn)品,客戶即調(diào)用者只知道這些,具體的哪個快餐店,如何制作什么漢堡,客戶并不關心,只要能到最方便的快餐店吃到漢堡,填飽肚子即可。具體的工廠是肯德基和麥當勞,具體產(chǎn)品是KFC的漢堡、KFC雞腿,他們這一組是相關的,另外一組是McDonald漢堡、McDonald雞腿,他們兩個是相關的,是可以左手拿著McDonald漢堡,右手拿著Mc-Donald雞腿狼吞虎咽的;我們把相關的產(chǎn)品,稱為一系列的產(chǎn)品,你還想吃薯條,稍微擴展一下,加一個薯條的產(chǎn)品,包括抽象薯條和具體的薯條。如下圖所示:藍色框圖中的肯德基的漢堡、雞腿和薯條是相關的,一系列的,由此可以看出抽象工廠設計模式給客戶提供的不再是單一的產(chǎn)品,而是提供一批系列的產(chǎn)品。 圖5 抽象工廠二 通過層層深入的代碼演示,再結(jié)合生活案例來理解抽象工廠,希望大家能夠掌握簡單三層到抽象工廠的講解技巧,在實際的授課中深入淺出、步步為營熟練地進行代碼演示,讓學員徹底理解并會使用抽象工廠設計模式。 Explains the Abstract Factory Pattern from the Shallow to the Deep Using the Case Teaching Method Xu Hong The article mainly elaborated the abstract factory pattern,through carries on the explanation using the case teaching method,will let the student understand and use the abstract plant design pattern thoroughly. abstract factory pattern;case teaching method;explanation G712 A 1000-8136(2010)32-0107-03


3 總結(jié)