DAO設計模式+工廠模式(Factory)
阿新 • • 發佈:2019-01-03
幫同學寫了一個JavaSE的小程式。通過這個小程式。練習了DAO設計模式+工廠模式的寫法。還算有收穫。
DAO設計模式在JavaSE中就是將資料操作和介面分開來寫。這樣便於後臺資料庫操作維護。也就是在介面類中不能出現sql包(java.sql.*;)。DAO設計模式也便於編寫介面和資料庫操作的人員同步開發。提高效率。
首先寫出一個DAO介面類,如:
- import ContactsSystem.vo.ContactsInfo;
- publicinterface Revisable{
- publicvoid addInfo(ContactsInfo ci);
- public
- publicvoid ModifyInfo(String name,ContactsInfo ci);
- public ContactsInfo searchInfo(String name);
- }
這個介面規範了DAO所實現的功能。
這是一個VO(成員變數)類:
- publicclass ContactsInfo {
- private String cName;
- private String cTel;
- private String cEmail;
- private String cAddress;
- public String getCName() {
- return cName;
- }
- publicvoid setCName(String name) {
- cName = name;
- }
- public String getCTel() {
- return cTel;
- }
- publicvoid setCTel(String tel) {
- cTel = tel;
- }
- public String getCEmail() {
- return cEmail;
- }
- publicvoid setCEmail(String email) {
- cEmail = email;
- }
- public String getCAddress() {
- return cAddress;
- }
- publicvoid setCAddress(String address) {
- cAddress = address;
- }
- }
隨後實現這個介面,如:
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import ContactsSystem.DAO.ConnDB;
- import ContactsSystem.vo.ContactsInfo;
- publicclass ContactsInfoDAO implements Revisable {
- @Override
- publicvoid ModifyInfo(String name,ContactsInfo ci) {
- // TODO Auto-generated method stub
- ConnDB.connectionDB();
- String sql = "UPDATE ContactsTable SET c_Name=?,c_Tel=?,c_Email=?,c_Address=? WHERE c_Name=?";
- PreparedStatement ps = null;
- try {
- ps = ConnDB.dbConn.prepareStatement(sql);
- ps.setString(1, ci.getCName());
- ps.setString(2, ci.getCTel());
- ps.setString(3, ci.getCEmail());
- ps.setString(4, ci.getCAddress());
- ps.setString(5, name);
- ps.executeUpdate();
- ps.close();
- ConnDB.closeDB();
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- @Override
- publicvoid addInfo(ContactsInfo ci) {
- // TODO Auto-generated method stub
- ConnDB.connectionDB();
- String sql = "INSERT INFO ContactsTable VALUES(?,?,?,?)";
- PreparedStatement ps = null;
- try {
- ps = ConnDB.dbConn.prepareStatement(sql);
- ps.setString(1, ci.getCName());
- ps.setString(2, ci.getCTel());
- ps.setString(3, ci.getCEmail());
- ps.setString(4, ci.getCAddress());
- ps.executeUpdate();
- ps.close();
- ConnDB.closeDB();
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- @Override
- publicvoid delInfo(String name) {
- // TODO Auto-generated method stub
- ConnDB.connectionDB();
- String sql = "DELETE FROM ContactsTable WHERE c_Name =?";
- PreparedStatement ps = null;
- try {
- ps = ConnDB.dbConn.prepareStatement(sql);
- ps.setString(1, name);
- ps.executeUpdate();
- ps.close();
- ConnDB.closeDB();
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- @Override
- public ContactsInfo searchInfo(String name) {
- // TODO Auto-generated method stub
- ConnDB.connectionDB();
- String sql = "SELECT * FROM ContactsTable WHERE c_Name=?";
- PreparedStatement ps = null;
- ContactsInfo ci=null;
- try {
- ps = ConnDB.dbConn.prepareStatement(sql);
- ps.setString(1, name);
- ResultSet rs = ps.executeQuery();
- while(rs.next()){
- ci=new ContactsInfo();
- ci.setCName(rs.getString("c_Name"));
- ci.setCTel(rs.getString("c_Tel"));
- ci.setCEmail(rs.getString("c_Email"));
- ci.setCAddress(rs.getString("c_Address"));
- }
- rs.close();
- ps.close();
- ConnDB.closeDB();
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return ci;
- }
- }
這個類實現了程式所需要的所有資料庫操作功能。隨後介面類直接呼叫就可以了。使得介面類中的程式碼會少很多。而且也便於維護。
但是當我們發現介面類在呼叫的過程中總是會NEW這個DAO和VO(成員變數)類,如:
- ContactsInfo ci = new ContactsInfo();
- Revisable ciDAO = new ContactsInfoDAO();
- ci.setCName(nameTextField.getText());
- ci.setCTel(telTextField.getText());
- ci.setCEmail(emailTextField.getText());
- ci.setCAddress(addressTextField.getText());
- ciDAO.addInfo(ci);
這樣如果我們的ciDAO發生了改變,那改動也是非常大的。所以就需要使用工廠模式了:
- publicclass DAOFactory {
- publicstatic Revisable makeInstance(){
- returnnew ContactsInfoDAO();
- }
- }
工廠模式就是提供一個new物件的“工廠”所有DAO類物件都在這裡產生。當發生更改時候,我們只需要更改此Factory類即可。
那麼我們上面的方法就可以改寫成:
- ContactsInfo ci = new ContactsInfo();
- ci.setCName(nameTextField.getText());
- ci.setCTel(telTextField.getText());
- ci.setCEmail(emailTextField.getText());
- ci.setCAddress(addressTextField.getText());
- DAOFactory.makeInstance().addInfo(ci);
由於makeInstance()是靜態方法,所以可以直接呼叫。
一般DAO模式和工廠模式都是一起出現。對於剛開始學習設計模式。這個設計模式是需要掌握的。