第八章 Java模式設計之數據訪問對象模式(2 / 3)

4).把所有的數據訪問集中到一個獨立的層。

因為所有的數據訪問操作現在被委托給DAO,所有單獨的數據訪問層可以被看作把數據訪問實現與應用程序中的其他代碼相隔離的。這種集中化使應用程序更容易地維護和管理。

5).不適用於容器管理的持久性

由於EJB容器用容器管理的持久性(CMP)來管理實體bean,該容器會自動地服務所有的持久性存儲訪問。使用容器管理的實體bean的應用程序不需要DAO層,因為該應用程序服務器透明地提供該功能。然而,當需要組合使用CMP和BMP時,DAO仍舊有用處。

6).添加其他層

DAO會在數據客戶端和數據源之間創建其他的對象層,其中該數據源需要被設計和實現以便於權衡該模式的好處。但是選擇本方法也會帶來額外的開銷。

7).需要類層次設計

在使用工廠策略時,我們需要設計和實現具體工廠的層次,以及這些工廠產生的具體產品層次。如果能夠確保這種靈活性,則有必要考慮這種額外的工作。這樣做會增加設計的複雜性。然而,在實現該工廠策略時,你可以首先考慮工廠方法模式,然後再根據需要過渡到抽象工廠。

六.範例代碼

1.實現數據訪問對象模式

範例9-4時表示Customer信息的持久性對象的DAO範例代碼。當findCustomer()被調用時,CloudscapeCustomerDAO創建一個Customer值對象。

範例9-6是使用DAO的範例代碼。

2.實現數據訪問對象的工廠策略

1)使用工廠方法模式

2)使用抽象工廠模式

範例代碼9-2是CloudscapeDAOFactory的範例代碼。

範例代碼9-3中的CustomerDAO接口為Customer持久性對象定義了DAO方法,這些接口是被所有具體DAO實現來實現的,比如CloudscapeCustomerDAO、OracleCustomerDAO、已經SybaseCustomerDAO。Account和OrederDAO接口也與此類似。

Example9.1AbstractDAOFactoryClass

//AbstractclassDAOFactory

publicabstractclassDAOFactory{

//ListofDAOtypessupportedbythefactory

publicstaticfinalintCLOUDSCAPE=1;

publicstaticfinalintORACLE=2;

publicstaticfinalintSYBASE=3;

...

//TherewillbeamethodforeachDAOthatcanbe

//created.Theconcretefactorieswillhaveto

//implementthesemethods.

publicabstractCustomerDAOgetCustomerDAO();

publicabstractAccountDAOgetAccountDAO();

publicabstractOrderDAOgetOrderDAO();

...

publicstaticDAOFactorygetDAOFactory(

intwhichFactory){

switch(whichFactory){

caseCLOUDSCAPE:

returnnewCloudscapeDAOFactory();

caseORACLE:

returnnewOracleDAOFactory();

caseSYBASE:

returnnewSybaseDAOFactory();

...

default:

returnnull;

}

}

}

Example9.2ConcreteDAOFactoryImplementationforCloudscape

//CloudscapeconcreteDAOFactoryimplementation

importjava.sql.*;

publicclassCloudscapeDAOFactoryextendsDAOFactory{

publicstaticfinalStringDRIVER="COM.cloudscape.core.RmiJdbcDriver";

publicstaticfinalStringDBURL="jdbc:cloudscape:rmi://localhost:1099/CoreJ2EEDB";

//methodtocreateCloudscapeconnections

publicstaticConnectioncreateConnection(){

//UseDRIVERandDBURLtocreateaconnection

//Recommendconnectionpoolimplementation/usage

}

publicCustomerDAOgetCustomerDAO(){

//CloudscapeCustomerDAOimplementsCustomerDAO

returnnewCloudscapeCustomerDAO();

}

publicAccountDAOgetAccountDAO(){

//CloudscapeAccountDAOimplementsAccountDAO

returnnewCloudscapeAccountDAO();

}

publicOrderDAOgetOrderDAO(){

//CloudscapeOrderDAOimplementsOrderDAO

returnnewCloudscapeOrderDAO();

}

...

}

Example9.3BaseDAOInterfaceforCustomer

//InterfacethatallCustomerDAOsmustsupport

publicinterfaceCustomerDAO{

publicintinsertCustomer(...);

publicbooleandeleteCustomer(...);

publicCustomerfindCustomer(...);