1. 程式人生 > 其它 >設計模式之工廠方法(r4筆記第89天)

設計模式之工廠方法(r4筆記第89天)

設計模式中,工廠方法模式的使用還是很頻繁的,但是似乎在工作中沒有留意或者重視。 在各大網站中對於工廠方法模式的例子一般都是舉女媧造人的例子,我就不做重複工作了,我覺得通過模擬oracle或者mysql的jdbc連線也是一個很生動的例子,我們完全可以通過工廠方法來模擬這種,對於不同的需求可以靈活的處理。 為此我畫了如下的UML圖。 我們定義一個藉口GeneralJDBC,其中有各種jdbc中涉及到的方法,但是對於這些方法,可能在Oracle,MySQL中會有一些不同之處,或者在使用中的細節差別。 我們定義了兩個實現類OracleJDBC和MySQLJDBC 在此基礎上,我們在需要呼叫的時候,可以根據對應的GeneralJDBC實現類來初始化連線。初始化的部分在DBConnInit中,這個類是一個抽象類,在DBConnFactory就是工廠方法的實現了。 裡面會根據對應的GeneralJDBC來做實際的例項化工作。 這些工作做完以後就可以通過客戶端來呼叫了。

實現的程式碼如下:

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;


public interface GeneralJDBC {

 public Connection initConnection() throws SQLException;

 public Statement createStatment(Connection conn) throws SQLException;

 public ResultSet executeQuery(Statement stmt,String SQL) throws SQLException;

 public void getRsResults(ResultSet rs) throws SQLException;

}
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();
}
}


}
import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.Statement;





public class MySQLJDBC implements GeneralJDBC{



    @Override

 public Connection initConnection() {

 

 return null;

 }





    @Override

 public Statement createStatment(Connection conn) {

 return null;

 }

 



    @Override

 public ResultSet executeQuery(Statement stmt, String SQL) {

 return null;

 }





    @Override

 public void getRsResults(ResultSet rs) {

 // TODO Auto-generated method stub

 

 }



}
public abstract class DBConnInit {

 public abstract <T extends GeneralJDBC> T initDBDriverClass(Class<T> dbDriverClass);

 

}
public class DBConnFactory extends DBConnInit {

    @Override

 public GeneralJDBC initDBDriverClass(Class<GeneralJDBC> dbDriverClass) {

        GeneralJDBC dbDriver = null;

 try {

            dbDriver = (GeneralJDBC) Class.forName(dbDriverClass.getName()).newInstance();

 } catch (InstantiationException e) {

            e.printStackTrace();

 } catch (IllegalAccessException e) {

            e.printStackTrace();

 } catch (ClassNotFoundException e) {

            e.printStackTrace();

 }

 return dbDriver;

 }



}
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 。。。