設計模式之工廠方法

jeanron100發表於2015-03-28
設計模式中,工廠方法模式的使用還是很頻繁的,但是似乎在工作中沒有留意或者重視。
在各大網站中對於工廠方法模式的例子一般都是舉女媧造人的例子,我就不做重複工作了,我覺得透過模擬oracle或者mysql的jdbc連線也是一個很生動的例子,我們完全可以透過工廠方法來模擬這種,對於不同的需求可以靈活的處理。

為此我畫了如下的UML圖。
我們定義一個藉口GeneralJDBC,其中有各種jdbc中涉及到的方法,但是對於這些方法,可能在Oracle,MySQL中會有一些不同之處,或者在使用中的細節差別。
我們定義了兩個實現類OracleJDBC和MySQLJDBC
在此基礎上,我們在需要呼叫的時候,可以根據對應的GeneralJDBC實現類來初始化連線。初始化的部分在DBConnInit中,這個類是一個抽象類,在DBConnFactory就是工廠方法的實現了。
裡面會根據對應的GeneralJDBC來做實際的例項化工作。
這些工作做完以後就可以透過客戶端來呼叫了。


實現的程式碼如下:

點選(此處)摺疊或開啟

  1. import java.sql.Connection;
  2. import java.sql.ResultSet;
  3. import java.sql.SQLException;
  4. import java.sql.Statement;


  5. public interface GeneralJDBC {
  6.     public Connection initConnection() throws SQLException;
  7.     public Statement createStatment(Connection conn) throws SQLException;
  8.     public ResultSet executeQuery(Statement stmt,String SQL) throws SQLException;
  9.     public void getRsResults(ResultSet rs) throws SQLException;
  10. }


點選(此處)摺疊或開啟

  1. import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;


    public class OracleJDBC implements GeneralJDBC {
    @Override
    public Connection initConnection() throws SQLException {
    return DriverManager.getConnection(
    "jdbc:oracle:thin:@127.0.0.1:1521:test01", "system", "oracle");
    }


    @Override
    public Statement createStatment(Connection tmp_Conn) throws SQLException {
    return tmp_Conn.createStatement();
    }


    @Override
    public ResultSet executeQuery(Statement tmp_stmt, String SQL)
    throws SQLException {
    return tmp_stmt.executeQuery(SQL);
    }


    @Override
    public void getRsResults(ResultSet rs) throws SQLException {
    int columnCnt;
    columnCnt = rs.getMetaData().getColumnCount();
    for (int i = 1; i <= columnCnt; i++) {
    System.out.print(rs.getMetaData().getColumnLabel(i) + "\t ");
    }
    System.out.println();


    while (rs.next()) {
    for (int i = 1; i <= columnCnt; i++) {
    System.out.print(rs.getString(i) + "\t ");
    }
    System.out.println();
    }
    }


    }


點選(此處)摺疊或開啟

  1. import java.sql.Connection;
  2. import java.sql.ResultSet;
  3. import java.sql.Statement;


  4. public class MySQLJDBC implements GeneralJDBC{

  5.     @Override
  6.     public Connection initConnection() {
  7.     
  8.         return null;
  9.     }


  10.     @Override
  11.     public Statement createStatment(Connection conn) {
  12.         return null;
  13.     }
  14.     

  15.     @Override
  16.     public ResultSet executeQuery(Statement stmt, String SQL) {
  17.         return null;
  18.     }


  19.     @Override
  20.     public void getRsResults(ResultSet rs) {
  21.         // TODO Auto-generated method stub
  22.         
  23.     }

  24. }



點選(此處)摺疊或開啟

  1. public abstract class DBConnInit {
  2.     public abstract <T extends GeneralJDBC> T initDBDriverClass(Class<T> dbDriverClass);
  3.     
  4. }


點選(此處)摺疊或開啟

  1. public class DBConnFactory extends DBConnInit {
  2.     @Override
  3.     public GeneralJDBC initDBDriverClass(Class<GeneralJDBC> dbDriverClass) {
  4.         GeneralJDBC dbDriver = null;
  5.         try {
  6.             dbDriver = (GeneralJDBC) Class.forName(dbDriverClass.getName()).newInstance();
  7.         } catch (InstantiationException e) {
  8.             e.printStackTrace();
  9.         } catch (IllegalAccessException e) {
  10.             e.printStackTrace();
  11.         } catch (ClassNotFoundException e) {
  12.             e.printStackTrace();
  13.         }
  14.         return dbDriver;
  15.     }

  16. }


點選(此處)摺疊或開啟

  1. import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;


    public class ConnClient {
    public static void main(String[] args) throws SQLException {
    new ConnClient().test();


    }
    public void test() throws SQLException{
    Connection conn;
    Statement stmt;
    ResultSet rs;
    DBConnInit factory = new DBConnFactory();
    GeneralJDBC oracleJDBC = factory.initDBDriverClass(OracleJDBC.class);
    conn = oracleJDBC.initConnection();
    stmt = oracleJDBC.createStatment(conn);
    rs = oracleJDBC.executeQuery(stmt, "select *from cat");
    oracleJDBC.getRsResults(rs);
    }
    }

呼叫客戶端程式的結果如下:
TABLE_NAME TABLE_TYPE  
LOGMNR_SESSION_EVOLVE$ TABLE  
LOGMNR_EVOLVE_SEQ$ SEQUENCE  
LOGMNR_SEQ$ SEQUENCE  
LOGMNR_DIDS$ SEQUENCE  
LOGMNR_UIDS$ SEQUENCE
。。。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1477364/,如需轉載,請註明出處,否則將追究法律責任。

相關文章