簡單的Java抽象工廠實現

工廠模式在項目中是常常用到的,有人說只有大項目纔會用到,小項目是體會不出來.其實使用設計模式與項目的大小沒有實質性的聯繫.設計模式是經驗的總結而不是衡量項目大小的標準.


以開發項目的DAO層爲例,在項目中客戶的需求是常常變動的,臨時更換數據庫的需求也是常常發生的,那我們要如何解決跨數據庫的功能,這裏就要使用到抽象工廠模式了.工廠模式常常用於創建多系列化的對象(如Orale系列,MySql系列)


1.首先定義相關接口(與平常的做法沒什麼區別)


Java代碼 
// 角色表DAO接口   
interface IroleDao {   
    void insert();   
  
    void update();   
}   
// 用戶表DAO接口   
interface IuserDao {   
    void find();   
  
    void delete();   
}  

2.不同的數據庫有不同的SQL語句所以實現時必須分數據庫來實現

Java代碼 
// 用戶表Oralce數據庫DAO   
class OracleuserDao implements IuserDao {   
    public void delete() {   
        System.out.println("Oralce 刪除用戶表數據");   
    }   
    public void find() {   
        System.out.println("Oralce 查詢用戶表數據");   
    }   
}   
  
// 用戶表MySql數據庫DAO   
class MySqluserDao implements IuserDao {   
    public void delete() {   
        System.out.println("MySql 刪除用戶數據");   
    }   
  
    public void find() {   
        System.out.println("MySql 查詢用戶數據");   
    }   
}   

// 角色表Oracle數據庫DAO
class OracleroleDao implements IroleDao {
 public void insert() {
  System.out.println("Oralce 對角色表插入數據");
 }
 public void update() {
  System.out.println("Oracle 對角色表更新數據");
 }
}

// 角色表MySql數據庫DAO
class MySqlroleDAO implements IroleDao {
 public void insert() {
  System.out.println("MySql 對角色表插入數據");
 }
 public void update() {
  System.out.println("Mysql 對角色表更新數據");
 }
}
這裏增加了一套DAO的實現 (與平時有所不同,如果有10個數據庫就要加上10種不同的實現,比較麻煩呀)


3.定義DAO工廠接口與實現(利用java反射機制生產出你需要的DAO如:userDAO,roleDao)

Java代碼 

// DAO工廠
abstract class DaoFactory {
 public static DaoFactory getInstance(String classname) {
  DaoFactory dao = null;
  try {
   dao = (DaoFactory) Class.forName(classname).newInstance();
  } catch (Exception e) {
   e.printStackTrace();
  }
  return dao;
 }

 abstract IuserDao getuserdao();
 abstract IroleDao getroledao();
}

// Oralce工廠
class OracleFactory extends DaoFactory {
 public IroleDao getroledao() {
  return new OracleroleDao();
 }
 public IuserDao getuserdao() {
  return new OracleuserDao();
 }
}

// MySql工廠
class MysqlFactory extends DaoFactory {
 public IroleDao getroledao() {
  return new MySqlroleDAO();
 }
 public IuserDao getuserdao() {
  return new MySqluserDao();
 }
}  

4. 定義配置文件

Java代碼 
class Config {   
    // Oralce   
    static final String ORALCE = "org.abc.OracleFactory";   
  
    static final String MYSQL = "org.abc.MysqlFactory";   
}  

配置文件可以定義到XML中去(好處:修改配置項之後不需要對JAVA文件進行編譯.)

5.測試你的輸出的DAO

Java代碼 
public class Dao {   
    public static void main(String[] args) {   
        DaoFactory.getInstance(Config.ORALCE).getroledao().insert();   
        DaoFactory.getInstance(Config.MYSQL).getroledao().insert();   
    }    
}  

總結


使用條件:一系列接口有一系列的實現
如上IuserDao、IroleDao等一系列的接口,他們可以有一系列的實現(Oracle方式、MySql方式)


OracleuserDao、OracleroleDao、MySqluserDao、MySqlroleDAO
組成元素(以上面例子)
一系列接口:IuserDao、IroleDao
一系列實現:Oracle系列、MySql系列
系列工廠類:Oracle系列工廠類、MySql系列工廠類(必須繼承抽象工廠類)
抽象工廠類:DaoFactory
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章