劉軍華,胡志剛
(中南大學軟件學院,湖南長沙 410083)
任何一名會思考的軟件開發(fā)人員隨著自身開發(fā)經(jīng)驗的不斷積累,軟件理論理解的不斷加深,都會不由自主地想一些方法或者捷徑,來提高自己的編碼效率,而不是一味的面對重復的問題做相同的工作,因為設計出高質(zhì)量、低耗費、易維護和可復用的面向?qū)ο蟮某绦蚴敲恳粋€軟件開發(fā)工程師共同的追求。而設計模式就是為解決重復問題而提出的一套較好的解決方案。在軟件設計和架構時,適當?shù)厥褂迷O計模式可以給系統(tǒng)帶來更大的可擴展性和盡量少的修改量。
設計模式起源于建筑,首先由建筑設計師亞歷山大提出的,然后推廣到軟件設計行業(yè)來。軟件行業(yè)最早出現(xiàn)的設計模式著作是GOF(Gang Of Fours)四人組所著的那本《設計模式——可復用面向?qū)ο筌浖A》,該書提出的設計模式共有23種,根據(jù)模式完成工作的不同,將設計模式劃分為創(chuàng)建型模式、結構型模式和行為型模式三大類。創(chuàng)建型模式與對象的創(chuàng)建有關,結構型模式是處理類或?qū)ο蟮慕M合,行為型模式是對類和對象怎樣交互和怎樣分配職責進行描述。工廠設計模式屬于創(chuàng)建型模式,根據(jù)其創(chuàng)建的形式的不同,工廠設計模式又有以下三種形態(tài):
1)簡單工廠模式 (Simple Factory):是用一個類來模擬工廠,通過該工廠類的靜態(tài)方法返回具體的產(chǎn)品類,而這些產(chǎn)品又源自一個抽象的產(chǎn)品。
2)工廠方法模式 (Factory method):是類的創(chuàng)建模式,定義一個創(chuàng)建工廠接口,將實際的創(chuàng)建工作推到子類工廠中。也就是原本的靜態(tài)類變成了一個抽象類或接口,而將制造的任務交給底下的具體實現(xiàn)類來完成。
3)抽象工廠模式(Abstract Factory):提供一個創(chuàng)建一系列相關或相互依賴的對象的接口,而無須指定具體的類。
本文主要討論工廠設計模式中的簡單工廠模式和工廠方法模式在C#中的應用與實現(xiàn),并通過Web教育資源管理系統(tǒng)為例體現(xiàn)工廠模式的優(yōu)勢。
WEB教育資源管理系統(tǒng)是指利用計算機信息技術手段,面向各類高職院校,構建一個基于校園網(wǎng)絡環(huán)境下,能實現(xiàn)對教育資源進行整合、歸類、查詢、共享、審核、管理的一個軟件平臺。主要功能有:
1)用戶空間的申請與生成:本系統(tǒng)旨在讓每一位教師擁有一個網(wǎng)上辦公室,讓每一位學生擁有一個網(wǎng)上學習空間。教師的工號和學生的學號即是空間的賬號,并根據(jù)院校的組織機構自動生成相應的管理空間。如系部空間、班級空間等。
2)整合其它系統(tǒng)的資源:通過二次開發(fā),能整合與共享各高職院校已經(jīng)存在的系統(tǒng)中的信息資源。比如,學籍管理系統(tǒng)中的學生檔案信息、教務管理系統(tǒng)中的教學安排信息等。
3)教育資源的開發(fā)與上傳:每個空間的主人都是資源開發(fā)的主體,先由各院校自定義好各類教育資源的模板,然后開發(fā)者再按照規(guī)定的模板自行制作開發(fā)。
4)教育資源的管理與審核:當開發(fā)者將教育資源上傳到服務器時,須經(jīng)管理員的審核后才能顯示在系統(tǒng)中,同時,為保護教育資源的使用權限,所有未注冊、未授權用戶只能瀏覽,不能復制和下載;為提高教育資源的質(zhì)量,在系統(tǒng)中設為推薦、評價、瀏覽次數(shù)等機制,并以此作為對教師或?qū)W生評價的依據(jù)之一。
另外,根據(jù)系統(tǒng)的設計要求,我們將系統(tǒng)中所涉及到的教育資源按以下方式進行分類:
1)按專業(yè)大類劃分:電子信息類、公共管理類等。
2) 按媒體格式劃分:文本類、圖形(像)類、音頻類、視頻類等。
3) 按學科課程劃分:語文、數(shù)學、商務英語、計算機基礎等。
4) 按資源種類劃分:重要文件、通知公告、規(guī)章制度、工作計劃、課程標準、實習實訓項目、案例庫、教案、課件、素材、習題集、試卷庫、影片等。
其中,系統(tǒng)在具體設計實現(xiàn)的時候,主要以教育資源的媒體格式為依據(jù)進行程序開發(fā)。下面從程序開發(fā)的角度闡述設計模式使用前后的變化。
在C#創(chuàng)建對象的方式為:類名 對象名=new構造函數(shù)名();這是開發(fā)人員創(chuàng)建對象常用的方法格式,使用new創(chuàng)建對象的缺點是事先必須明確知道要實例化的類是什么,這樣就違背了工程化的設計思想。下面用示例說明使用new的局限性。
在WEB教育資源管理系統(tǒng)中,教育資源類(Resource)、文本資源類(TxtResource)、圖形/像資源類(PicResource)、視頻資源類(FlvResource)等存在著繼承關系,如圖1所示。
圖1 三種教育資源類與Resource的繼承關系圖
在C#中,一般情況下會按以下代碼聲明多態(tài)對象,從而引發(fā)多態(tài):
按照圖1的類設計思路,假若現(xiàn)在要分別調(diào)用文本資源類、圖形/像資源類和視頻資源類的顯示方法來顯示相應的資源內(nèi)容,在客戶端通常用以下代碼來實現(xiàn):
這樣雖然能達到所需的效果,但客戶端調(diào)用ResDisplay方法時就必須首先要知道是要顯示哪一種類型的資源,即必須事先知道要實例化哪一個類,并且隨著資源種類的不斷增多,這種類似的代碼還會重復更多。也就是說上述的代碼有很大局限性,不夠靈活,耦合性太高,不適合工程化的項目開發(fā)。
為了提高上述代碼的靈活性,降低耦合度,用戶在創(chuàng)建對象時不必事先知道每次是要實例化哪一個類,為此我們引入了工廠設計模式中的簡單工廠設計模式來解決這一問題。具體做法是,將創(chuàng)建實例的操作與使用實例的操作分開,構建一個模擬生成資源對象的工廠,把創(chuàng)建資源對象的操作全都放到了工廠里面去,客戶端直接使用工廠內(nèi)的創(chuàng)建資源對象的方法,只要傳入需要的資源類型就行了,而不必去知道創(chuàng)建的細節(jié)。在加入簡單工廠設計模式后,圖1中類的關系修改如圖2所示。
圖2 使用簡單工廠模式的教育資源類圖
按照圖2的類設計思路,假若現(xiàn)在要分別調(diào)用文本資源類、圖形/像資源類和視頻資源類的顯示方法來顯示相應的資源內(nèi)容,就可以按以下代碼方式去實現(xiàn):
1)建立一個專門生產(chǎn)Resource實例的的工廠
這樣,只需要傳入需要創(chuàng)建資源的類型字符,工廠就會實例化合適的對象,通過多態(tài),返回父類的方式實現(xiàn)了各種教育資源的顯示。
按照簡單工廠設計模式的做法,解決了創(chuàng)建對象的問題,降低了與具體類型資源的依賴。但也存在一些不夠理想的地方,比如今后新增一種資源,除了增加相應的資源類以外,還得修改原有的資源工廠類,在switch中增加分支,這樣不但對擴展開放了,對修改也開放了,這樣就違背了“開放-封閉原則”。為此,我們采用工廠方法模式來解決這一問題。
根據(jù)依賴倒轉(zhuǎn)原則,我們把工廠類抽象出一個接口,這個接口只有一個方法,就是創(chuàng)建抽象產(chǎn)品(這里產(chǎn)品指資源)的工廠方法。然后,所有的要生產(chǎn)具體類的工廠,就去實現(xiàn)這個接口,這樣,一個簡單工廠模式的工廠類,變成了一個工廠抽象接口和多個具體生成對象的工廠,于是我們今后要新增一個教育資源時,就不需要更改原有的工廠類了,只需要增加此資源類和相應的工廠類就可以了。應用工廠方法模式后,WEB教育資源管理系統(tǒng)中資源的類圖修改如圖3所示。
圖3 使用工廠方法模式的教育資源類圖
按照圖3的類設計思路,假若現(xiàn)在要分別調(diào)用文本資源類、圖形/像資源類和視頻資源類的顯示方法來顯示相應的資源內(nèi)容,在客戶端通常用以下代碼來實現(xiàn):
這樣,只需要修改資源工廠類名就可以創(chuàng)建相應的資源實例了,不要再修改原有的資源工廠類了,這樣既克服了簡單工廠違背開放-封閉原則的缺點,又保持了封裝對象創(chuàng)建過程的優(yōu)點,使得要創(chuàng)建其它對象時,不需要做大的改動就可實現(xiàn),降低了客戶端程序與資源類的耦合。
本文論述了工廠模式中的簡單工廠設計模式和工廠方法設計模式在重構WEB教育資源管理系統(tǒng)中的應用,通過對比展示應用模式后可以很好地解決功能的擴展的問題以及提高代碼的可重用性和可維護性。當開發(fā)人員在編碼時不能預見需要創(chuàng)建哪一種類的實例或不希望創(chuàng)建了哪個類的實例以及如何創(chuàng)建實例的信息暴露給外部程序的時候,我們建議這個時候使用工廠模式是較好的一種方案,因為工廠模式就是專門負責將大量有共同接口的類實例化,而且不必事先知道每次是要實例化哪一個類的模式。
[1]程杰.大話設計模式[M].北京:清華大學出版社,2009.
[2]徐衛(wèi)星.設計模式之工廠模式在招生系統(tǒng)中的應用[J].微型機與應用,2007,(11).
[3]Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides. Design Paaerns:Elements of Reusable Object-Oriented software[M].北京:機械工業(yè)出版社,2005.
[4]唐文芳.在數(shù)據(jù)訪問層使用抽象工廠設計模式的c#實現(xiàn)[J].硅谷,2009,(8).