以壹個開發項目的DAO層為例。在項目中,客戶的需求是不斷變化的,經常會出現臨時更換數據庫的需求。那麽如何解決跨數據庫功能,我們會在抽象工廠中用到。工廠模型通常用於創建多序列化對象(如Orale系列和MySql系列)。
1.首先,定義相關的接口(與通常的做法沒有區別)。
Java代碼
//角色表的DAO接口
界面IroleDao {
void insert();
void update();
}
//用戶表DAO接口
接口IuserDao {
void find();
void delete();
}
//角色表的DAO接口
界面IroleDao {
void insert();
void update();
}
//用戶表DAO接口
接口IuserDao {
void find();
void delete();
} 2.不同的數據庫有不同的SQL語句,所以必須在不同的數據庫中實現。
Java代碼
//用戶表Oralce數據庫DAO
OracleuserDao類實現IuserDao {
公共void delete() {
System.out.println("Oralce刪除用戶表數據");
}
公共void find() {
System.out.println("Oralce查詢用戶表數據");
}
}
//用戶表MySql數據庫DAO
MySqluserDao類實現IuserDao {
公共void delete() {
System.out.println("MySql刪除用戶數據");
}
公共void find() {
System.out.println("MySql查詢用戶數據");
}
}
//角色表Oracle數據庫DAO
類OracleroleDao實現IroleDao {
public void insert() {
System.out.println("Oralce將數據插入角色表");
}
公共void更新(){
System.out.println("Oracle將數據更新到角色表");
}
}
//角色表MySql數據庫DAO
MySqlroleDAO類實現IroleDao {
public void insert() {
System.out.println("MySql將數據插入角色表");
}
公共void更新(){
System.out.println("Mysql更新數據到角色表");
}
}
//用戶表Oralce數據庫DAO
OracleuserDao類實現IuserDao {
公共void delete() {
System.out.println("Oralce刪除用戶表數據");
}
公共void find() {
System.out.println("Oralce查詢用戶表數據");
}
}
//用戶表MySql數據庫DAO
MySqluserDao類實現IuserDao {
公共void delete() {
System.out.println("MySql刪除用戶數據");
}
公共void find() {
System.out.println("MySql查詢用戶數據");
}
}
//角色表Oracle數據庫DAO
類OracleroleDao實現IroleDao {
public void insert() {
System.out.println("Oralce將數據插入角色表");
}
公共void更新(){
System.out.println("Oracle將數據更新到角色表");
}
}
//角色表MySql數據庫DAO
MySqlroleDAO類實現IroleDao {
public void insert() {
System.out.println("MySql將數據插入角色表");
}
公共void更新(){
System.out.println("Mysql更新數據到角色表");
}
}
這裏增加壹組DAO實現(和平時不同,如果有10個數據庫,增加10個不同的實現會比較麻煩)。
3.定義DAO工廠的接口和實現(使用java反射機制產生妳需要的DAO,比如userDAO,roleDao)。
Java代碼
//道工廠
抽象類DaoFactory {
公共靜態Dao factory getInstance(String class name){
DaoFactory dao = null
嘗試{
Dao =(Dao factory)class . for name(class name)。new instance();
} catch(異常e) {
e . printstacktrace();
}
還刀;
}
抽象IuserDao get userdao();
抽象IroleDao getroledao();
}
// Oralce工廠
類OracleFactory擴展了DaoFactory {
公共IroleDao getroledao() {
返回新的OracleroleDao();
}
公共IuserDao getuserdao() {
返回新的Oracle userdao();
}
}
// MySql工廠
MysqlFactory類擴展了DaoFactory {
公共IroleDao getroledao() {
返回新的MySqlroleDAO();
}
公共IuserDao getuserdao() {
返回新的MySQL userdao();
}
}
//道工廠
抽象類DaoFactory {
公共靜態Dao factory getInstance(String class name){
DaoFactory dao = null
嘗試{
Dao =(Dao factory)class . for name(class name)。new instance();
} catch(異常e) {
e . printstacktrace();
}
還刀;
}
抽象IuserDao get userdao();
抽象IroleDao getroledao();
}
// Oralce工廠
類OracleFactory擴展了DaoFactory {
公共IroleDao getroledao() {
返回新的OracleroleDao();
}
公共IuserDao getuserdao() {
返回新的Oracle userdao();
}
}
// MySql工廠
MysqlFactory類擴展了DaoFactory {
公共IroleDao getroledao() {
返回新的MySqlroleDAO();
}
公共IuserDao getuserdao() {
返回新的MySQL userdao();
}
}
4.定義配置文件
Java代碼
類別配置{
// Oralce
靜態最終字符串ORALCE = " org . ABC . Oracle factory ";
靜態最終字符串MYSQL = " org . ABC . MYSQL factory ";
}
類別配置{
// Oralce
靜態最終字符串ORALCE = " org . ABC . Oracle factory ";
靜態最終字符串MYSQL = " org . ABC . MYSQL factory ";
}
配置文件可以用XML定義(優點:修改配置項後不需要編譯JAVA文件。)
5.測試輸出的DAO
Java代碼
公共類道{
公共靜態void main(String[] args) {
DaoFactory.getInstance(Config。ORALCE)。getroledao()。insert();
DaoFactory.getInstance(Config。MYSQL)。getroledao()。insert();
}
}
公共類道{
公共靜態void main(String[] args) {
DaoFactory.getInstance(Config。ORALCE)。getroledao()。insert();
DaoFactory.getInstance(Config。MYSQL)。getroledao()。insert();
}
}
摘要
使用條件:壹系列接口有壹系列實現
它們可以有壹系列的接口(Oracle模式,MySql模式),比如IuserDao,IroleDao。
OracleuserDao、OracleroleDao、MySqluserDao、MySqlroleDAO
組件元素(在上面的例子中)
壹系列接口:IuserDao,IroleDao。
壹系列實現:Oracle系列,MySql系列。
系列工廠類:Oracle系列工廠類和MySql系列工廠類(抽象工廠類必須繼承)。
抽象工廠類:DaoFactory