同一個目標,同一個夢想

          One Target,One Dream
          posts - 25, comments - 11, trackbacks - 0, articles - 37

          淺談DAO工廠設計模式

          Posted on 2008-11-26 08:01 J2EE Home工作室 閱讀(389) 評論(0)  編輯  收藏 所屬分類: 設計模式
          隨著軟件分層設計的流行及廣泛的應用,對于DAO的設計模式大家已經不再陌生了,DAO層已經在軟件系統的開發中成為必不可少的一層,將后臺的數據層和前臺的VO進行分離。前段時間也針對于DAO的設計介紹過一個基于Hibernate的泛型DAO的設計。
          csdn blog:http://blog.csdn.net/yongtree/archive/2008/03/12/2172071.aspx
          javaeye blog:http://yongtree.javaeye.com/blog/170449

                通過DAO的設計的確可以讓我們的軟件系統已經將數據層和表現層進行了簡單的分離,讓我們系統各層次的功能更加的清晰。所以我們開始洋洋得意了,DAO的引入讓系統的耦合性更加的松散,表現層再也不需要關心后臺數據操作的變化了。于是我們開始高枕無憂了,我們肆無忌憚的在表現層通過調用DAO來實現我們的系統了。事實真的如此嗎?那我們就舉個例子來看看我們的系統是否真的具有解偶的能力了。
                現在我們有個員工管理系統,在該系統中,Person.java表示員工這個對象,它對應著數據庫中的person表。還有用于操作Person對象的DAO接口—PersonDAO.java,還有一個PersonDAO的實現類PersonDAOImpl.java。在PersonDAOImpl.java中我們實現了操作Person對象的所有的方法。我們很自豪的說,看我們已經把操作封裝在PersonDAO中了,現在我們可以在表現層(jsp,或者VO操作類中)使用PersonDAO personDAO=new PersonDAOImpl()來調用DAO操作我們的數據對象了。當我們陶醉于自己寫的優美的代碼的時候,項目經理來通知了,由于使用Hibernate的效率偏低,客戶開始不滿了,還是讓我們重新用JDBC再重寫一遍吧。于是所有DAO的Hibernate實現開始全部轉換成JDBC實現。但是項目經理建議不要破壞現有的Hibernate實現,以后可以通過技術研究來提升Hibernate的訪問效率。于是我們開始寫了又寫了一套JDBC的實現—PersonDAOJDBCImpl.java,現在問題出來了,表現層大量的使用了PersonDAO personDAO=new PersonDAOImpl(),全部改成new PersonDAOJDBCImpl()談何容易,我們是不是開始欲哭無淚了。
                怎么解決類似的問題呢?于是我們開始引進工廠模式。我們建立一個類DaoFactory.java對DAO進行統一管理。
          DaoFactory.java:
                public class DaoFactory{
                public static PersonDAO getPersonDAOInstance()
                {
                     return new PersonDAOImpl() ;
                }
                //得到其他的DAO實例
                ……
          }
          表現層通過PersonDAO personDAO=DaoFactory.get getPersonDAOInstance();來實例化DAO實例。這樣問題就解決了,DAO改變了,我們只需要在DAO工廠類中修改一下代碼:return new PersonDAOJDBCImpl() ;那我們的應用就快速切換到JDBC實現了。可見利用工廠模式,我們的系統又進一步的解耦,表現層真的無需再關系DAO層的變化了,一切交給DAO工廠來解決。
          使用過Spring這樣框架的開發人員都知道,Spring通過利用IoC來實現類之間的解耦。其實在DAO工廠中我們也可以簡單的借鑒一下IoC的思想,更進一步解除類之間的耦合。Spring是通過配置xml文件來進行IoC的,那么我們也可以借助于xml文件來實現。比如下面的xml:
          <?xml version="1.0"?>
          <config>
              <daos>
                 <!-- 組織機構服務接口實現類 -->
                 <dao id="organizationService"
                     type="com.baiyyy.oa.services.organization.OrganizationServiceImpl">
                 </dao>
                 <!-- 工作流參與者接口 -->
                 <dao id="participantService"
                     type="com.baiyyy.workflow.services.impl.ParticipantServiceImpl">
                 </dao>
                 <!-- 工作流定義接口 -->
                 <dao id="processDefinitionService"
                     type="com.baiyyy.workflow.services.impl.ProcessDefinitionServiceImpl">
                 </dao>
                 <!-- 工作流實例接口 -->
                 <dao id="processInstanceService"
                     type="com.baiyyy.workflow.services.impl.ProcessInstanceServiceImpl">
                 </dao>
              </daos>
          </config>
          這是我設計實現的工作流系統給業務系統提供的接口所配置的xml,所有的接口都配置在xml中,我們怎么使用呢?我只不過是把DAO工廠進行進一步的改進,通過ProcessInstanceService processInstanceService=DaoFactory.getDao(ProcessInstanceService.class,” processInstanceService”);從傳入的參數我們可以看出,我們清楚的知道要調用的接口ProcessInstanceService,同時通過字符串” processInstanceService”,我們可以解析上面的配置文件,得到具體實現類的路徑,通過反射得到該實現類的實例。具體的DAO工廠類的實現,朋友們有興趣可以自己去實現,我就不詳細介紹了。
                終于寫完了,以上便是對DAO工廠一些淺顯的理解。現在正在學習設計模式,以后會根據自己的所學所思,介紹自己對各個設計模式的理解,希望大家一塊學習討論。

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 南宫市| 于田县| 札达县| 枣阳市| 朝阳县| 南岸区| 隆子县| 汉阴县| 南江县| 新宁县| 江门市| 绵阳市| 荥阳市| 台前县| 巴林左旗| 金门县| 垣曲县| 瑞丽市| 鹰潭市| 枣强县| 张家港市| 邮箱| 潍坊市| 洪雅县| 科技| 曲沃县| 卓资县| 平度市| 永顺县| 施秉县| 台南市| 定州市| 博兴县| 通许县| 深圳市| 增城市| 金华市| 乐亭县| 乌鲁木齐县| 慈溪市| 米泉市|