摘 要:在設(shè)計(jì)與開發(fā)網(wǎng)上購(gòu)物系統(tǒng)各個(gè)模塊的過程中,綜合、靈活地使用了Java的常用設(shè)計(jì)模式。其中,為了提供對(duì)不同數(shù)據(jù)庫(kù)系統(tǒng)的良好支持,應(yīng)用簡(jiǎn)單工廠模式實(shí)現(xiàn)了產(chǎn)品管理模塊的相關(guān)功能,有效增強(qiáng)了系統(tǒng)的可擴(kuò)展性和可維護(hù)性。
關(guān)鍵詞:設(shè)計(jì)模式;簡(jiǎn)單工廠模式;數(shù)據(jù)庫(kù)系統(tǒng)
中圖分類號(hào):TP311.10
產(chǎn)品管理是網(wǎng)上購(gòu)物系統(tǒng)中最重要的模塊之一,前臺(tái)用戶和后臺(tái)管理員的大部分操作都會(huì)涉及產(chǎn)品模塊的具體功能。根據(jù)客戶對(duì)系統(tǒng)所支持的用戶量、開發(fā)成本等不同因素的實(shí)際需求,系統(tǒng)定制時(shí)有可能會(huì)選擇不同的數(shù)據(jù)庫(kù)系統(tǒng)作為數(shù)據(jù)源,這就要求我們開發(fā)的系統(tǒng)需要提供對(duì)不同數(shù)據(jù)庫(kù)系統(tǒng)的良好支持。因此,在數(shù)據(jù)源發(fā)生改變,例如,從My SQL數(shù)據(jù)庫(kù)變更為SQL Server的時(shí)候,應(yīng)能使得只需要修改少量的代碼或配置文件,就可以實(shí)現(xiàn)購(gòu)物網(wǎng)站對(duì)不同數(shù)據(jù)庫(kù)系統(tǒng)的支持。
1 設(shè)計(jì)模式簡(jiǎn)介
設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用,并且經(jīng)過分類編目的代碼設(shè)計(jì)經(jīng)驗(yàn)總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼,讓代碼更容易被他人理解,保證代碼的可靠性。設(shè)計(jì)模式從應(yīng)用的角度被分為三個(gè)大的類型,分別是創(chuàng)建型設(shè)計(jì)模式、結(jié)構(gòu)型設(shè)計(jì)模式和行為型設(shè)計(jì)模式。
創(chuàng)建型模式,就是用來創(chuàng)建對(duì)象的模式,它抽象了實(shí)例化的過程。它幫助一個(gè)系統(tǒng)獨(dú)立于如何創(chuàng)建、組合和表示它的那些對(duì)象。簡(jiǎn)單工廠模式屬于創(chuàng)建型模式,又被稱為靜態(tài)工廠方法(Static Factory Method)模式。它是由一個(gè)工廠對(duì)象決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例。簡(jiǎn)單工廠模式是工廠模式家族中最簡(jiǎn)單實(shí)用的模式,可以理解為是不同工廠模式的一個(gè)特殊實(shí)現(xiàn)。
2 簡(jiǎn)單工廠模式在產(chǎn)品管理模塊中的應(yīng)用
2.1 產(chǎn)品管理模塊概述
產(chǎn)品管理模塊采用三層模型進(jìn)行開發(fā)。DAO層負(fù)責(zé)數(shù)據(jù)庫(kù)的相關(guān)操作,向下直接訪問數(shù)據(jù)庫(kù)系統(tǒng),同時(shí)向上層的Product Manager類提供各種操作數(shù)據(jù)庫(kù)的服務(wù);Product Manager類位于業(yè)務(wù)邏輯層,向下調(diào)用DAO層提供的各種接口,向上給前臺(tái)的頁面展示提供各種服務(wù);前臺(tái)的jsp頁面直接調(diào)用Product Manager類提供的各種方法實(shí)現(xiàn)豐富的展示效果。采用分層的模型雖然增加了一定的代碼開發(fā)工作量,但分層的方式帶來的好處也是顯而易見的。不但有效降低了各個(gè)模塊之間的耦合性,很好的實(shí)現(xiàn)了相關(guān)類內(nèi)部的封裝,而且提高了代碼的可擴(kuò)展性和可維護(hù)性,當(dāng)某一層服務(wù)的內(nèi)部邏輯發(fā)生改變時(shí),對(duì)外提供的接口不需要改變,使需要修改的代碼量減至最少。
2.2 簡(jiǎn)單工廠模式的引入
項(xiàng)目初期,鑒于客戶對(duì)系統(tǒng)所支持的用戶量要求不高,并且開發(fā)成本也比較低,項(xiàng)目組選擇了My SQL數(shù)據(jù)庫(kù)。相應(yīng)的,對(duì)于產(chǎn)品管理模塊的設(shè)計(jì)來說,最基本的實(shí)現(xiàn)方式是在Product DAO類中,提供對(duì)My SQL數(shù)據(jù)庫(kù)進(jìn)行操作的各種方法,程序中涉及的SQL語句也是只有在My SQL數(shù)據(jù)庫(kù)下才可以運(yùn)行的。當(dāng)然,考慮到系統(tǒng)后續(xù)的擴(kuò)展性,以及應(yīng)能提供更強(qiáng)大的數(shù)據(jù)管理能力和更好的操作性能,可能會(huì)選擇諸如SQL Server、Oracle等高端數(shù)據(jù)庫(kù)產(chǎn)品。這種情況下,必然要修改Product DAO類中的大量代碼,系統(tǒng)的靈活性是很差的。Java程序設(shè)計(jì)提倡“面向接口”編程,即控制反轉(zhuǎn)。因此,我們重新設(shè)計(jì)了Product DAO類,將其抽象為一個(gè)接口,而真正實(shí)現(xiàn)對(duì)不同數(shù)據(jù)庫(kù)系統(tǒng)進(jìn)行具體操作的代碼,放在Product MysqlDAO、Product SQL ServerDAO等實(shí)現(xiàn)了Product DAO接口的類當(dāng)中。
程序優(yōu)化到這一步,已經(jīng)初步實(shí)現(xiàn)了支持不同數(shù)據(jù)庫(kù)系統(tǒng)的功能。Product Manager類中將持有Product DAO接口的一個(gè)引用,當(dāng)網(wǎng)上購(gòu)物系統(tǒng)所使用的數(shù)據(jù)源變更時(shí),我們只需在Product Manager類的setProduct DAO方法中,實(shí)例化不同的子類對(duì)象即可。但實(shí)際上,代碼還可以繼續(xù)優(yōu)化使得程序的靈活性得到進(jìn)一步的提高。我們采用了簡(jiǎn)單工廠設(shè)計(jì)模式。選擇工廠模式的好處在于,可以更加方便的更改應(yīng)用程序,方便對(duì)系統(tǒng)進(jìn)行擴(kuò)展。例如,當(dāng)我們需要在Product DAO接口的基礎(chǔ)上再增加一個(gè)實(shí)現(xiàn)了該接口,并且支持其它數(shù)據(jù)庫(kù)系統(tǒng)的子類時(shí),在之前的設(shè)計(jì)中需要把以前使用Product DAO接口的地方都修改為創(chuàng)建一個(gè)新的子類對(duì)象,這樣做顯然也增加了模塊間的耦合度。通過使用工廠模式,統(tǒng)一管理對(duì)象的創(chuàng)建過程,并且在我們的代碼中只要做一處修改就可以了。
我們構(gòu)建了一個(gè)工廠類Product DAO Factory,對(duì)外提供create Product DAO方法,把創(chuàng)建ProductDAO接口對(duì)象的處理封裝在該簡(jiǎn)單工廠的內(nèi)部。對(duì)于ProductManager類而言,不需要再了解ProductDAO的實(shí)現(xiàn)細(xì)節(jié),工廠類ProductDAOFactory統(tǒng)一管理ProductDAO對(duì)象的創(chuàng)建過程,其它類只需要調(diào)用它的createProductDAO方法即可獲得ProductDAO的對(duì)象從而使用其中的方法操作數(shù)據(jù)庫(kù)。工廠類與ProductDAO接口和各個(gè)實(shí)現(xiàn)了該接口的子類之間的關(guān)系如圖1所示。
圖1 采用簡(jiǎn)單工廠模式設(shè)計(jì)UML圖
為了最大限度的提高程序的靈活性,可以將數(shù)據(jù)源的信息記錄在配置文件里,根據(jù)從配置文件里讀出的內(nèi)容,來決定所創(chuàng)建的ProductDAO接口的對(duì)象實(shí)例。項(xiàng)目中我們使用.properties文件來管理配置信息,例如,添加“DateBase=MySQL”至sysconfig.properties文件,接下來,給出簡(jiǎn)單工廠ProductDAOFactory類的關(guān)鍵部分實(shí)現(xiàn)代碼如下。
//創(chuàng)建ProductDAOFactory對(duì)象
if(pdFactory == 1) {
pdFactory = new ProductDAOFactory();
}
//從sysconfig.properties讀取DataBase的值,結(jié)果存放在字符串變量strDB中
if(strDB.equals(“MySQL”)) {
productDAO = new ProductMySQLDAO();
}
else if (strDB.equals(“SQLSERVER”)) {
productDAO = new ProductSQLServerDAO();
}
//else根據(jù)DataBase的值創(chuàng)建不同的實(shí)現(xiàn)了ProductDAO接口的對(duì)象
在簡(jiǎn)單工廠類ProductDAOFactory的代碼實(shí)現(xiàn)中,我們把實(shí)例化簡(jiǎn)單工廠對(duì)象和ProductDAO對(duì)象的過程放在靜態(tài)語句塊中,即在ProductDAOFactory類被加載的時(shí)候就完成了對(duì)象的創(chuàng)建,從而使得創(chuàng)建對(duì)象的代碼不用每次調(diào)用工廠類的時(shí)候都執(zhí)行一遍。
3 結(jié)束語
本文以網(wǎng)上購(gòu)物系統(tǒng)中的產(chǎn)品管理模塊的設(shè)計(jì)與實(shí)現(xiàn)為例,討論了設(shè)計(jì)模式在軟件開發(fā)過程中的應(yīng)用,展示了設(shè)計(jì)模式在面向?qū)ο蟮某绦蛟O(shè)計(jì)中的重要作用。針對(duì)產(chǎn)品管理模塊中提供對(duì)各種數(shù)據(jù)庫(kù)系統(tǒng)的支持這一具體問題,提出了簡(jiǎn)單工廠模式這一設(shè)計(jì)思路并給出了具體解決方案。通過工廠模式的應(yīng)用,使系統(tǒng)的結(jié)構(gòu)更加合理,開發(fā)效率顯著提高,尤其是系統(tǒng)的可擴(kuò)展性、可維護(hù)性大大的增強(qiáng)。如今,各種設(shè)計(jì)模式已經(jīng)在軟件產(chǎn)品的設(shè)計(jì)與開發(fā)過程中得到越來越廣泛的應(yīng)用。
參考文獻(xiàn):
[1]徐宏喆,侯迪.使用軟件設(shè)計(jì)模式教程[M].北京:清華大學(xué)出版社,2009:103-112.
[2]耿祥義,郝麗.JAVA設(shè)計(jì)模式在視頻監(jiān)控系統(tǒng)軟件設(shè)計(jì)中的應(yīng)用[J].電腦知識(shí)與技術(shù),2010,6(30):8490-8492.
[3]秦澎濤,王蘇文.簡(jiǎn)單工廠模式在數(shù)據(jù)訪問層中的應(yīng)用[J].計(jì)算機(jī)應(yīng)用技術(shù),2009,30(7):1799-1801.
作者簡(jiǎn)介:馮賀(1982.08-),男,河南省安陽縣人,教師,助教,碩士研究生,研究方向:信息技術(shù)、數(shù)據(jù)挖掘。