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

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

1.引言                                                                                            

     抛弃ssh开发自己的框架(公司中一般都采用了内部的技术框架)在做orm中最重要的一点就是要支持各种主流的数据库 , 实际开发中用于生产的数据库一般为DB2 Oracle SqlServer居多,由于各数据库的厂商不同 ,导致数据库库之间都存在各自的特性。   例如:数据的分页 

     oracle 采用rownum伪列 db2 采用 rownumber()over()   sqlserver 可以使用rownumber top等关键字

     因此在实现orm的搭建的时候就需要考虑到各数据库的特点 采用不同的代码来体现 

2.通过工厂方法来兼容各大数据库特性                                                  

     以各个数据库的分页为例 

     在分页的时候一般情况下会对分页的信息进行封装:封装到PageResult类中

      

/** * 保存分页的信息 */class PageResult
{ private int curPage ; //当前页 private int pageSize ; //每页显示的记录数 private int totalPage ; //总页数 = (总记录数+每页显示的记录数-1)/每页显示的记录数 private int totalRecords ; //总记录数 private List
entityList = new ArrayList
() ; //分页数据保存的集合 //getter 和 setter方法}

 

      各数据库分页是通过分页查询的方法获得数据 ,可抽象出一个接口 : DataQuery 

   

/** * 数据查询 :这里以分页为特例 */interface DataQuery{    /**     * @param sql : 查询的sql语句     * @param paramsList : 参数     * @param curPage : 当前页     * @param pageSize :每页显示的记录数     * @return     */    public 
PageResult
splitQuery(String sql,List paramsList,int curPage,int pageSize) ;}

 

 实现上面的接口 体现不同数据库的分页特性: 

   OracleDataQuery

class OracleDataQuery implements DataQuery{    @Override    public 
PageResult
splitQuery(String sql, List paramsList, int curPage, int pageSize) { System.out.println("oracle 数据库分页实现"); //等待以后去实现 return null; } }

 

   Db2DataQuery

class Db2DataQuery implements DataQuery{    @Override    public 
PageResult
splitQuery(String sql, List paramsList, int curPage, int pageSize) { System.out.println("Db2 数据库分页实现"); //等待以后去实现 return null; } }

 

     实际开发中为了获得DataQuery对象 当然不会选择去直接 new OracleDataQuery()  或者new Db2DataQuery() 了  一般通过创建DataQuery的工厂+反射来获得实际分页实现对象

 我们知道 工厂方法定义了一个用于创建对象的接口,让子类决定实例化哪一个类 按照以上的原理创建了一下的接口: 

interface POJOFactory{     //数据库操作的若干方法省略    public DataQuery getDataQuery() ;}

 

来获得DataQuery, 让其子类来实例化对象

class OracleFactory implements POJOFactory{    @Override    public DataQuery getDataQuery() {        return new OracleDataQuery();    }}class Db2Factory implements POJOFactory{    @Override    public DataQuery getDataQuery() {        return new Db2DataQuery();    }    }

 

      客户端的调用: 

public class FacotoryMethodDemo {    public static void main(String[] args) {        POJOFactory oracleFactory = new OracleFactory() ;         DataQuery  dataQuery  = oracleFactory.getDataQuery() ;        dataQuery.splitQuery(null, null, 0, 0) ;    }}

 

       要注意的是: 在实际开发中底层选择的数据库信息是通过配置文件来指定的 (例如hibernate中通过dialect来指定采用何种数据库)  通过解析配置文件 然后利用反射机制(或者简单工厂)来获得POJOFactory,而不是想上面客户端那样简单的调用 .

     以下为本章节中的具体代码: 

     

/********************************************************************** * 
 * FILE : FacotoryMethodDemo.java * CLASS : FacotoryMethodDemo * * AUTHOR : Liaokailin * * FUNCTION : TODO * * *====================================================================== * CHANGE HISTORY LOG *---------------------------------------------------------------------- * MOD. NO.|   DATE   |   NAME  | REASON  | CHANGE REQ. *---------------------------------------------------------------------- *             |2014-3-25|Liaokailin| Created | * DESCRIPTION: * 
***********************************************************************/package org.lkl.patterns.factorymethod;import java.util.ArrayList;import java.util.List;/** * 工厂方法案例 */public class FacotoryMethodDemo { public static void main(String[] args) { POJOFactory oracleFactory = new OracleFactory() ; DataQuery dataQuery = oracleFactory.getDataQuery() ; dataQuery.splitQuery(null, null, 0, 0) ; }} /** * 数据查询 :这里以分页为特例 */interface DataQuery{ /** * @param sql : 查询的sql语句 * @param paramsList : 参数 * @param curPage : 当前页 * @param pageSize :每页显示的记录数 * @return */ public
PageResult
splitQuery(String sql,List paramsList,int curPage,int pageSize) ;}/** * 保存分页的信息 */class PageResult
{ private int curPage ; //当前页 private int pageSize ; //每页显示的记录数 private int totalPage ; //总页数 = (总记录数+每页显示的记录数-1)/每页显示的记录数 private int totalRecords ; //总记录数 private List
entityList = new ArrayList
() ; //分页数据保存的集合 //getter 和 setter方法}class OracleDataQuery implements DataQuery{ @Override public
PageResult
splitQuery(String sql, List paramsList, int curPage, int pageSize) { System.out.println("oracle 数据库分页实现"); //等待以后去实现 return null; } }class Db2DataQuery implements DataQuery{ @Override public
PageResult
splitQuery(String sql, List paramsList, int curPage, int pageSize) { System.out.println("Db2 数据库分页实现"); //等待以后去实现 return null; } }interface POJOFactory{ //数据库操作的若干方法 public DataQuery getDataQuery() ;}class OracleFactory implements POJOFactory{ @Override public DataQuery getDataQuery() { return new OracleDataQuery(); }}class Db2Factory implements POJOFactory{ @Override public DataQuery getDataQuery() { return new Db2DataQuery(); } }
完整代码

 

    

 

 

转载于:https://www.cnblogs.com/liaokailin/p/3617876.html

你可能感兴趣的文章
Java中map集合系列原理剖析
查看>>
Python Tornado初学笔记之数据库(二)
查看>>
二叉树C语言
查看>>
jQuery操作json数据
查看>>
记忆讲师石伟华微信公众号2018所有文章汇总(待更新)
查看>>
Vue2.0选中当前鼠标移入移除加样式
查看>>
迷宫C描述——栈的举例
查看>>
Html5 tips
查看>>
Android——KEYCODE列表
查看>>
cf251.2.C (构造题的技巧)
查看>>
Suse碎碎念
查看>>
C#面向对象基础(三) 属性
查看>>
Odoo字段类型详解
查看>>
时间戳有什么作用,如何定义时间戳??
查看>>
网络编程数据链路层
查看>>
项目延期原因及应对之道
查看>>
python3 判断数据类型
查看>>
Chrome浏览器 调试工具 vue-devtools 的安装和使用
查看>>
门面(Facade)模式
查看>>
html第一堂课
查看>>