抽象工廠模式(java)

關鍵字: java 抽象工廠模式

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

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

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

Java代碼
  1. // 角色表DAO接口  
  2. interface IroleDao {  
  3.     void insert();  
  4.   
  5.     void update();  
  6. }  
  7. // 用戶表DAO接口  
  8. interface IuserDao {  
  9.     void find();  
  10.   
  11.     void delete();  
  12. }  

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

Java代碼
  1. // 用戶表Oralce數據庫DAO  
  2. class OracleuserDao implements IuserDao {  
  3.     public void delete() {  
  4.         System.out.println("Oralce 刪除用戶表數據");  
  5.     }  
  6.   
  7.     public void find() {  
  8.         System.out.println("Oralce 查詢用戶表數據");  
  9.     }  
  10. }  
  11.   
  12. // 用戶表MySql數據庫DAO  
  13. class MySqluserDao implements IuserDao {  
  14.     public void delete() {  
  15.         System.out.println("MySql 刪除用戶數據");  
  16.     }  
  17.   
  18.     public void find() {  
  19.         System.out.println("MySql 查詢用戶數據");  
  20.     }  
  21. }  
  22. // 角色表Oracle數據庫DAO  
  23. class OracleroleDao implements IroleDao {  
  24.     public void insert() {  
  25.         System.out.println("Oralce 對角色表插入數據");  
  26.     }  
  27.   
  28.     public void update() {  
  29.         System.out.println("Oracle 對角色表更新數據");  
  30.     }  
  31. }  
  32.   
  33. // 角色表MySql數據庫DAO  
  34. class MySqlroleDAO implements IroleDao {  
  35.     public void insert() {  
  36.         System.out.println("MySql 對角色表插入數據");  
  37.     }  
  38.   
  39.     public void update() {  
  40.         System.out.println("Mysql 對角色表更新數據");  
  41.     }  
  42. }  

這里增加了一套DAO的實現 (與平時有所不同,如果有10個數據庫就要加上10種不同的實現,比較麻煩呀)

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

Java代碼
  1. // DAO工廠  
  2. abstract class DaoFactory {  
  3.     public static DaoFactory getInstance(String classname) {  
  4.         DaoFactory dao = null;  
  5.         try {  
  6.             dao = (DaoFactory) Class.forName(classname).newInstance();  
  7.         } catch (Exception e) {  
  8.             e.printStackTrace();  
  9.         }  
  10.         return dao;  
  11.     }  
  12.   
  13.     abstract IuserDao getuserdao();  
  14.   
  15.     abstract IroleDao getroledao();  
  16. }  
  17.   
  18. // Oralce工廠  
  19. class OracleFactory extends DaoFactory {  
  20.     public IroleDao getroledao() {  
  21.         return new OracleroleDao();  
  22.     }  
  23.     public IuserDao getuserdao() {  
  24.         return new OracleuserDao();  
  25.     }  
  26. }  
  27.   
  28. // MySql工廠  
  29. class MysqlFactory extends DaoFactory {  
  30.     public IroleDao getroledao() {  
  31.         return new MySqlroleDAO();  
  32.     }  
  33.     public IuserDao getuserdao() {  
  34.         return new MySqluserDao();  
  35.     }  
  36. }  

4. 定義配置文件

Java代碼
  1. class Config {  
  2.     // Oralce  
  3.     static final String ORALCE = "org.abc.OracleFactory";  
  4.   
  5.     static final String MYSQL = "org.abc.MysqlFactory";  
  6. }  

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

5.測試你的輸出的DAO

Java代碼
  1. public class Dao {  
  2.     public static void main(String[] args) {  
  3.         DaoFactory.getInstance(Config.ORALCE).getroledao().insert();  
  4.         DaoFactory.getInstance(Config.MYSQL).getroledao().insert();  
  5.     }  
  6.   
  7. }  

總結

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

OracleuserDao、OracleroleDao、MySqluserDao、MySqlroleDAO
組成元素(以上面例子)
一系列接口:IuserDao、IroleDao
一系列實現:Oracle系列、MySql系列
系列工廠類:Oracle系列工廠類、MySql系列工廠類(必須繼承抽象工廠類)
抽象工廠類:DaoFactory