2011-06-19 67 views
31

我知道工廠和抽象工廠的方法,但我想在Java中創建一個DAO工廠模式。什麼是DAO工廠模式?

  1. 我想知道它的重要性。
  2. 它的用法

我已經檢查this link但我很難理解。

任何人都可以在示例的幫助下解釋它嗎?

編輯:這裏是DAO模式的一個例子,因爲我理解它:

public interface UserDAO { 
    public void insert(User user); 
    public void update(User user); 
    public void delete(int userId); 
} 

實現:

public class UserDAOImpl implements UserDAO { 
    @Override 
    public void delete(int userId) { 
     // delete user from user table 
    } 

    @Override 
    public User[] findAll() { 
     // get a list of all users from user table 
     return null; 
    } 

    @Override 
    public User findByKey(int userId) { 
     // get a user information if we supply unique userid 
     return null; 
    } 

    @Override 
    public void insert(User user) { 
     // insert user into user table 
    } 

    @Override 
    public void update(User user) { 
     // update user information in user table 
    } 
} 

工廠:

public class UserDAOFactory { 
    public static UserDAO getUserDAO(String type) { 
     if (type.equalsIgnoreCase("jdbc")) { 
      return new UserDAOImpl(); 
     } else { 
      return new UserDAOImpl(); 
     } 
    } 
} 

客戶端代碼:

User user=new User(); 
user.setName("Jinoy P George"); 
user.setDesignation("Programmer"); 
user.setAge(35); 
//get a reference to UserDAO object 
UserDAO userDAO=UserDAOFactory.getUserDAO("jdbc"); 
//call insert method by passing user object 
userDAO.insert(user); 

這個道模式是否正確?

我應該在哪裏打開連接並關閉它?

+5

您的'MammalsFactory'創建'SQL'和'Oracle'?有趣;) –

+0

您是否已經檢查了http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html中「使用抽象工廠模式」一節中的示例代碼? – joschi

+0

是的,我有,但我無法理解... – coder25

回答

17

也許你不明白的是代碼是如何工作的?看起來很好。

僅供參考:

  • 什麼被定義爲一個UserDAOImpl可以,如果你認爲它命名爲UserDAOMySQLImpl和另一個新的UserDAOMSSQLImpl得到更好的理解,所以對每個數據庫的訪問,您可能需要。

  • 在每一個你應該處理連接和添加其他東西,如特定數據庫服務器配置的私有函數它可能需要和不強制需要在接口(UserDAO)中聲明,但作爲最低限度,你必須始終實現接口中定義的所有方法,然後在工廠(UserDAOFactory)的條件下,你可以有這樣的事情:

`

public class UserDAOFactory{ 

    public static UserDAO getUserDAO(String type){ 
     if (type.equalsIgnoreCase("mysql")){ 
      return new UserDAOMySQLImpl(); 
     }else{ 
      return new UserDAOMSSQLImpl(); 
     } 
    } 
} 

更清晰一點?

然後,在客戶端,而不是像一個硬編碼線:

UserDAO userDAO=UserDAOFactory.getUserDAO("jdbc"); 

你可以有一個屬性文件,以便能夠動態的DAO之間進行切換,已經檢索到的從屬性該字符串的文件,你可以簡單地請執行以下操作:

UserDAO userDAO=UserDAOFactory.getUserDAO(myStringFromPropertiesFile); 

根據屬性文件中的定義,myStringFromPropertiesFile將包含「mysql」或「mssql」。

希望這會有所幫助!

24

DAO代表「數據訪問對象」。它是一個基於接口的類,它可以處理您的CRUD操作,併爲特定對象提供關係數據庫。下面是一個使用泛型的例子:

package persistence; 

public interface GenericDao<K extends Serializable, T> 
{ 
    public T find(K id); 
    public List<T> find(); 
    public K save(T value); 
    public void update(T value); 
    public void delete(T value); 
} 

認爲一個工廠作爲「虛擬構造函數」的:它的創作方法返回的接口類型,但你可以要求它根據需要創建任意多個不同的實現。

+0

我不想使用泛型 – coder25

+1

@prema - 沒關係。您不必使用泛型。 –

+17

@prema:這不是*給我的代碼*網站。如果您仍然不明白,請提出具體問題。 –