1. 程式人生 > >DAO設計模式+工廠模式(Factory)

DAO設計模式+工廠模式(Factory)

幫同學寫了一個JavaSE的小程式。通過這個小程式。練習了DAO設計模式+工廠模式的寫法。還算有收穫。

 DAO設計模式在JavaSE中就是將資料操作和介面分開來寫。這樣便於後臺資料庫操作維護。也就是在介面類中不能出現sql包(java.sql.*;)。DAO設計模式也便於編寫介面和資料庫操作的人員同步開發。提高效率。

    首先寫出一個DAO介面類,如:

  1. import ContactsSystem.vo.ContactsInfo;
  2. publicinterface Revisable{
  3. publicvoid addInfo(ContactsInfo ci);
  4. public
    void delInfo(String name);
  5. publicvoid ModifyInfo(String name,ContactsInfo ci);
  6. public ContactsInfo searchInfo(String name);
  7. }

    這個介面規範了DAO所實現的功能。

    這是一個VO(成員變數)類:

  1. publicclass ContactsInfo {
  2. private String cName;
  3. private String cTel;
  4. private String cEmail;
  5. private String cAddress;
  6. public String getCName() {
  7. return cName;
  8.     }
  9. publicvoid setCName(String name) {
  10.         cName = name;
  11.     }
  12. public String getCTel() {
  13. return cTel;
  14.     }
  15. publicvoid setCTel(String tel) {
  16.         cTel = tel;
  17.     }
  18. public String getCEmail() {
  19. return cEmail;
  20.     }
  21. publicvoid setCEmail(String email) {
  22.         cEmail = email;
  23.     }
  24. public String getCAddress() {
  25. return cAddress;
  26.     }
  27. publicvoid setCAddress(String address) {
  28.         cAddress = address;
  29.     }
  30. }

    隨後實現這個介面,如:

  1. import java.sql.PreparedStatement;
  2. import java.sql.ResultSet;
  3. import java.sql.SQLException;
  4. import ContactsSystem.DAO.ConnDB;
  5. import ContactsSystem.vo.ContactsInfo;
  6. publicclass ContactsInfoDAO implements Revisable {
  7. @Override
  8. publicvoid ModifyInfo(String name,ContactsInfo ci) {
  9. // TODO Auto-generated method stub
  10.         ConnDB.connectionDB();
  11.         String sql = "UPDATE ContactsTable SET c_Name=?,c_Tel=?,c_Email=?,c_Address=? WHERE c_Name=?";
  12.         PreparedStatement ps = null;
  13. try {
  14.             ps = ConnDB.dbConn.prepareStatement(sql);
  15.             ps.setString(1, ci.getCName());
  16.             ps.setString(2, ci.getCTel());
  17.             ps.setString(3, ci.getCEmail());
  18.             ps.setString(4, ci.getCAddress());
  19.             ps.setString(5, name);
  20.             ps.executeUpdate();
  21.             ps.close();
  22.             ConnDB.closeDB();
  23.         } catch (SQLException e) {
  24. // TODO Auto-generated catch block
  25.             e.printStackTrace();
  26.         }
  27.     }
  28. @Override
  29. publicvoid addInfo(ContactsInfo ci) {
  30. // TODO Auto-generated method stub
  31.         ConnDB.connectionDB();
  32.         String sql = "INSERT INFO ContactsTable VALUES(?,?,?,?)";
  33.         PreparedStatement ps = null;
  34. try {
  35.             ps = ConnDB.dbConn.prepareStatement(sql);
  36.             ps.setString(1, ci.getCName());
  37.             ps.setString(2, ci.getCTel());
  38.             ps.setString(3, ci.getCEmail());
  39.             ps.setString(4, ci.getCAddress());
  40.             ps.executeUpdate();
  41.             ps.close();
  42.             ConnDB.closeDB();
  43.         } catch (SQLException e) {
  44. // TODO Auto-generated catch block
  45.             e.printStackTrace();
  46.         }
  47.     }
  48. @Override
  49. publicvoid delInfo(String name) {
  50. // TODO Auto-generated method stub
  51.         ConnDB.connectionDB();
  52.         String sql = "DELETE FROM ContactsTable WHERE c_Name =?";
  53.         PreparedStatement ps = null;
  54. try {
  55.             ps = ConnDB.dbConn.prepareStatement(sql);
  56.             ps.setString(1, name);
  57.             ps.executeUpdate();
  58.             ps.close();
  59.             ConnDB.closeDB();
  60.         } catch (SQLException e) {
  61. // TODO Auto-generated catch block
  62.             e.printStackTrace();
  63.         }
  64.     }
  65. @Override
  66. public ContactsInfo searchInfo(String name) {
  67. // TODO Auto-generated method stub
  68.         ConnDB.connectionDB();
  69.         String sql = "SELECT * FROM  ContactsTable WHERE c_Name=?";
  70.         PreparedStatement ps = null;
  71.         ContactsInfo ci=null;
  72. try {
  73.             ps = ConnDB.dbConn.prepareStatement(sql);
  74.             ps.setString(1, name);
  75.             ResultSet rs = ps.executeQuery();
  76. while(rs.next()){
  77.                 ci=new ContactsInfo();
  78.                 ci.setCName(rs.getString("c_Name"));
  79.                 ci.setCTel(rs.getString("c_Tel"));
  80.                 ci.setCEmail(rs.getString("c_Email"));
  81.                 ci.setCAddress(rs.getString("c_Address"));
  82.             }
  83.             rs.close();
  84.             ps.close();
  85.             ConnDB.closeDB();
  86.         } catch (SQLException e) {
  87. // TODO Auto-generated catch block
  88.             e.printStackTrace();
  89.         }
  90. return ci;
  91.     }
  92. }

    這個類實現了程式所需要的所有資料庫操作功能。隨後介面類直接呼叫就可以了。使得介面類中的程式碼會少很多。而且也便於維護。

    但是當我們發現介面類在呼叫的過程中總是會NEW這個DAO和VO(成員變數)類,如:

  1. ContactsInfo ci = new ContactsInfo();
  2. Revisable ciDAO = new ContactsInfoDAO();
  3. ci.setCName(nameTextField.getText());
  4. ci.setCTel(telTextField.getText());
  5. ci.setCEmail(emailTextField.getText());
  6. ci.setCAddress(addressTextField.getText());
  7. ciDAO.addInfo(ci);

    這樣如果我們的ciDAO發生了改變,那改動也是非常大的。所以就需要使用工廠模式了:

  1. publicclass DAOFactory {
  2. publicstatic Revisable makeInstance(){
  3. returnnew ContactsInfoDAO();
  4.     }
  5. }

    工廠模式就是提供一個new物件的“工廠”所有DAO類物件都在這裡產生。當發生更改時候,我們只需要更改此Factory類即可。

    那麼我們上面的方法就可以改寫成:

  1.                     ContactsInfo ci = new ContactsInfo();
  2.                     ci.setCName(nameTextField.getText());
  3.                     ci.setCTel(telTextField.getText());
  4.                     ci.setCEmail(emailTextField.getText());
  5.                     ci.setCAddress(addressTextField.getText());
  6.                     DAOFactory.makeInstance().addInfo(ci);

由於makeInstance()是靜態方法,所以可以直接呼叫。

一般DAO模式和工廠模式都是一起出現。對於剛開始學習設計模式。這個設計模式是需要掌握的。