冰浪

          哥已不再年輕 - 堅(jiān)定夢想,畢生追求!
          posts - 85, comments - 90, trackbacks - 0, articles - 3
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          ????? 在上一篇日記中我已經(jīng)提到了松耦合,在一個(gè)類中,我們也盡量不要與別的對(duì)象發(fā)生緊密的聯(lián)系,讓一個(gè)類符合封裝性,類與類之間做到松耦合,避免牽一發(fā)而動(dòng)全身。繼承最大的缺點(diǎn)就是打破封裝,所以組合優(yōu)于繼承。在分層軟件結(jié)構(gòu)中,我們也應(yīng)該盡量做到各層之間松耦合,使某一層的改動(dòng)對(duì)其它層的影響減到最小,這樣利于軟件功能修改和擴(kuò)充,利于軟件的移植。

          上篇里,我提到定義 Dao 接口的目的最終是為了做到分層結(jié)構(gòu)間松耦合,但僅利用上篇的方法并不能達(dá)到目的,比如在 CSUOA 里,在具體實(shí)現(xiàn) Dao 實(shí)例如 OauserDao.class 是采用 Hibernate 進(jìn)行,假如后來我覺得 Hibernate 的效率不夠高,想換成別的 ORM 框架如 JDO 進(jìn)行改進(jìn)呢?此時(shí)我要做的就是再寫一個(gè)有相應(yīng)實(shí)例方法的 JdoOauserDao.class 類,它實(shí)現(xiàn)了 Dao 接口類,因此它也具有 Dao 接口類型。在業(yè)務(wù)層調(diào)用時(shí),我需要將所有 Dao dao = new OauserDao(); 這樣的代碼替換成 Dao dao = new JdoOauserDao; 如果有大量的這樣的代碼存在,我也只能相應(yīng)地一一替換。從這可以看出,這樣做使業(yè)務(wù)層與持久層之間的耦合非常高,維護(hù)的成本也相當(dāng)高,而這是我所不希望的。

          一個(gè)設(shè)計(jì)精良的系統(tǒng),在設(shè)計(jì)之前就必須考慮到將來的種種變動(dòng),并要提供可簡單實(shí)現(xiàn)的方案,這樣才不至將大量的人力物力浪費(fèi)在將來的軟件維護(hù)上。

          為了實(shí)現(xiàn)這個(gè)目標(biāo),在 CSUOA 中就要用到設(shè)計(jì)模式中的工廠模式,它屬于創(chuàng)建模式。先來看我是如何實(shí)現(xiàn)這個(gè)工廠類的:

          //DaoFactory.class 工廠類

          public class DaoFactory{

          ?

          ? static final String OAUSER_DAO="OauserDao.class";

          ? static final String MAIL_DAO="MailDao.class";

          ? static final String MESSAGE_DAO="MessageDao.class";

          ?

          ? public static Dao getInstance(String daoNameStr){

          ??????? try{

          ???????????????????? Class c = Class.forName(daoNameStr);

          ???????????????????? dao=(Dao)c.newInstance();

          ????????????? }catch(Exception e){

          ???????????????????? e.printStackTrace();????????????

          ????????????? }

          ????????????? return dao;

          ? }

          }

          ?

          由上述代碼中可以看出,在這個(gè)工廠類里有一個(gè)靜態(tài)方法 getInstance() ,用于獲取具體的 Dao 實(shí)例類,而我們也看到其返回類型為 Dao 接口類型,而不是 OauserDao Dao 的實(shí)例類類型,這就為所有的 Dao 實(shí)例類對(duì)象提供了統(tǒng)一的獲取途徑。從這可以看出接口類的作用。如何使用這個(gè)工廠類呢?是這樣的: Dao dao = DaoFactory.getInstrance(“OAUSER_DAO”) ,而不是直接 new 一個(gè)對(duì)象出來了。而當(dāng)要做出之前提出的改動(dòng)時(shí),我就只要將這個(gè) DaoFactory 類里的 static final String OAUSER_DAO="OauserDao.class"; 改為 static final String OAUSER_DAO="JdoOauserDao.class"; 就可以了,業(yè)務(wù)層代碼基本上不需要改動(dòng),這就實(shí)現(xiàn)了業(yè)務(wù)層與持久層間的松耦合。

          在業(yè)務(wù)層里,我們始終只通過 Dao 接口進(jìn)行操作,并沒有出現(xiàn)如 OauserDao 這樣代碼,好像不存在一樣,而且我們根本也不需要知道有這樣的類存在。從這里我們可以進(jìn)一步體會(huì)接口的用法及其方便性。

          ?

          設(shè)計(jì)模式,在我接觸它之前,編寫程序從來不會(huì)考慮那么多,總認(rèn)為要得到一個(gè)對(duì)象時(shí), new 一個(gè)出來是天經(jīng)地義的事,也根本不會(huì)考慮什么松耦合之類的問題。學(xué)習(xí)設(shè)計(jì)模式,能讓自己在面向?qū)ο缶幊趟枷肷系玫缴A。

          評(píng)論

          # re: 畢業(yè)設(shè)計(jì)開發(fā)日記連載5:松耦合與工廠模式  回復(fù)  更多評(píng)論   

          2007-02-28 11:01 by DoubleHeart
          之所以你會(huì)有這種問題,就是因?yàn)槟銢]用Spring,如果你用了Spring的IoC、AOP后,你絕對(duì)不會(huì)再有這種無聊想法與功能需求了!!!

          說實(shí)話看了三篇你寫的東西后實(shí)在覺著你很弱,所以給你個(gè)建議,與其這么作,不如不作,對(duì)你今后所謂的工作提高幾乎沒有任何幫助!!!

          # re: 畢業(yè)設(shè)計(jì)開發(fā)日記連載5:松耦合與工廠模式  回復(fù)  更多評(píng)論   

          2007-03-14 10:59 by L
          同意。。干嘛不用spring。你自己的這些東西又過時(shí)又不合理。

          # re: 畢業(yè)設(shè)計(jì)開發(fā)日記連載5:松耦合與工廠模式  回復(fù)  更多評(píng)論   

          2007-03-16 11:43 by 冰浪
          我覺得學(xué)習(xí)是一個(gè)過程。
          如果一個(gè)剛學(xué)習(xí)jsp的人,他在試著按著自己的想法用jsp來做一個(gè)小程序時(shí),你們是不是也覺得他很可笑,你們也許會(huì)說
          “為什么不用框架呢?你自己的這些東西又過時(shí)又不合理。”
          我要說明一點(diǎn)的是,我現(xiàn)在可以說是一個(gè)入門者,我現(xiàn)在所做的這些東西我也覺得沒什么不好。
          不過,謝謝各位的評(píng)論。

          # re: 畢業(yè)設(shè)計(jì)開發(fā)日記連載5:松耦合與工廠模式  回復(fù)  更多評(píng)論   

          2007-06-19 23:14 by ggyyleo
          樓上幾位說話真刻薄
          會(huì)幾個(gè)框架就了不起了?
          作者能寫出自己的想法本身就很不錯(cuò)了
          主站蜘蛛池模板: 东辽县| 武安市| 竹山县| 无棣县| 上杭县| 武清区| 滕州市| 仲巴县| 阳山县| 玉屏| 繁峙县| 梁河县| 志丹县| 盖州市| 德惠市| 牡丹江市| 区。| 民乐县| 安岳县| 尚义县| 象山县| 宣汉县| 连江县| 长治县| 鸡东县| 阳曲县| 谢通门县| 册亨县| 大连市| 米泉市| 玉林市| 方正县| 眉山市| 喀什市| 普宁市| 合江县| 尼木县| 志丹县| 固安县| 望都县| 即墨市|