博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之工厂方法
阅读量:2446 次
发布时间:2019-05-10

本文共 3830 字,大约阅读时间需要 12 分钟。

设计模式中,工厂方法模式的使用还是很频繁的,但是似乎在工作中没有留意或者重视。
在各大网站中对于工厂方法模式的例子一般都是举女娲造人的例子,我就不做重复工作了,我觉得通过模拟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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/23718752/viewspace-1477364/

你可能感兴趣的文章
如何防止视频在Chrome中自动播放
查看>>
如何使用Synology NAS下载文件(并避免在夜间开启计算机)
查看>>
使用批处理脚本上传ftp_通过批处理脚本将文件上传到FTP站点
查看>>
linux下如何更改主机名_如何在不重新启动的情况下更改Linux主机名
查看>>
pxe网络启动引导程序_如何使用PXE设置网络可引导实用程序光盘
查看>>
凌乱的yyy_如何清理凌乱的Internet Explorer上下文菜单
查看>>
Laravel Eloquent:API资源
查看>>
在React中使用Font Awesome 5
查看>>
React Hooks入门
查看>>
盖茨比乔布斯_用盖茨比快速浏览WordPress站点
查看>>
vue.js表单验证_Vue.js中的模板驱动表单验证
查看>>
软件测试结束标志_使用功能标志进行生产中的测试
查看>>
css网格_在CSS网格中放置,跨度和密度
查看>>
火狐动态调试css_使用Firefox开发工具调试CSS网格
查看>>
服务周期性工作内容_使服务工作者生命周期神秘化
查看>>
nuxt.js 全局 js_在Nuxt.js应用中实现身份验证
查看>>
具有NgClass和NgStyle的Angular 2+类
查看>>
网络抓取_使用ScrapeStack轻松进行网络抓取
查看>>
koa express_Koa简介-Express的未来
查看>>
github请求超时_在GitHub中创建第一个请求请求
查看>>