當前位置:成語大全網 - 書法字典 - Java抽象工廠

Java抽象工廠

工廠模式經常在項目中使用。有人說只用於大型項目,不用於小型項目。事實上,設計模式的使用與項目的大小沒有實質性的關系。設計模式是經驗的總結,而不是衡量項目大小的標準。

以壹個開發項目的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