日期:2014-05-16  浏览次数:20515 次

JDBC 设计模式 (欢迎大家讨论)

?? 今天上午面试中,考官问我一个关于JDBC的设计模式的问题,但是回答是利用Bridge模式、Service Locator。后来,我想了仔细想了一下,其实还有一些。

?

为什么是Bridge呢?

?

?? ?因为JDBC驱动中,有一个jdbc-odbc,这个利用桥接模式。从Drvier到Connection中的DriverManager,Connection到ResultSet的Statement,这两个对象不是起了Bridge对象的作用吗?同时JDBC的接口和驱动类实现也是分离的。

?

为什么是Service Locator呢?

?

?? ?在JDBC驱动加载是,需要URL参数,这个东西和JDNI类似,通过“命名空间”。我当时没有记错,经过核实,它确实通过Provider来提供具体的实现。JDBC,XML,NIO等技术,JDK采用的SPI的机制。

?

?? 上述说法难免牵强,因此删除。

?

还有那些?

?

?? 抽象工厂:如果把Connection,Statement作为工厂类的话,那么自然他们是抽象工厂,Connection可以产生抽象的工厂Statement或者PreparedStatement。

?

?? 单例模式:通过ClassLoader加载java.sql.Drvier的实现类,JDBC系统会保存一个单例。

?

?? 组合模式:JDBC驱动中,底层的Connection实现,需要知道Driver的元信息,自然,Statement也需要Connection。至少,MySQL是这么实现的。

?

?? 但是我考虑没有把adapter作为答案,因为我觉得JDBC驱动实现是一种接口编程,没有过多的类型适配,也不存在接口兼容。至少,我在MySQL实现中,没有注意到。

?

?? 作者知识有限,欢迎大家一起讨论和指正,谢谢。

1 楼 jerryfeng 2010-06-03  
说到JDBC的设计,首先想到就是AbstractFactory
不过愚以为Driver,Connection和Statement,ResultSet对象一样,都是工厂产品,而DriverManager才是工厂

至于楼主说到单例,Class.forName干的事是JVM加载类的操作,非JDBC体系内的类设计相关;非要找个单例的话,DriverManager才是

Composite模式嘛,主要强调"整体组合局部"来构建的复合对象概念,而对象之间组合使用是很平常的,最多算是对象关系

Service Locator是来自Core J2EE Patterns,强调的分布式场景下的远程服务查找,不能因为JDBC中的“URL参数,这个东西和JDNI类似”就称之为Service Locator,因为设计模式就是词汇表,表达的已定义的典型场景,非XXX思想,找个疑似案例就往上套的,哎,程序员也受天朝思想余毒侵害了。。。
2 楼 mercyblitz 2010-06-03  
jerryfeng 写道
说到JDBC的设计,首先想到就是AbstractFactory
不过愚以为Driver,Connection和Statement,ResultSet对象一样,都是工厂产品,而DriverManager才是工厂

至于楼主说到单例,Class.forName干的事是JVM加载类的操作,非JDBC体系内的类设计相关;非要找个单例的话,DriverManager才是

Composite模式嘛,主要强调"整体组合局部"来构建的复合对象概念,而对象之间组合使用是很平常的,最多算是对象关系

Service Locator是来自Core J2EE Patterns,强调的分布式场景下的远程服务查找,不能因为JDBC中的“URL参数,这个东西和JDNI类似”就称之为Service Locator,因为设计模式就是词汇表,表达的已定义的典型场景,非XXX思想,找个疑似案例就往上套的,哎,程序员也受天朝思想余毒侵害了。。。



DriverManager 确实是利用ClassLoader来实现的,可能我的表达有误。

JDBC的URL也是一种远程连接,他也是通过自己的“命名域”来获得Connection,JDBC也支持分布式。
3 楼 stoneskin 2010-06-04  
钻牛角尖。。
4 楼 kimmking 2010-07-16  
<div class="quote_title">mercyblitz 写道</div>
<div class="quote_div">
<div class="quote_title">jerryfeng 写道</div>
<div class="quote_div">说到JDBC的设计,首先想到就是AbstractFactory <br>不过愚以为Driver,Connection和Statement,ResultSet对象一样,都是工厂产品,而DriverManager才是工厂 <br><br>至于楼主说到单例,Class.forName干的事是JVM加载类的操作,非JDBC体系内的类设计相关;非要找个单例的话,DriverManager才是 <br><br>Composite模式嘛,主要强调"整体组合局部"来构建的复合对象概念,而对象之间组合使用是很平常的,最多算是对象关系 <br><br>Service Locator是来自Core J2EE Patterns,强调的分布式场景下的远程服务查找,不能因为JDBC中的“URL参数,这个东西和JDNI类似”就称之为Service Locator,因为设计模式就是词汇表,表达的已定义的典型场景,非XXX思想,找个疑似案例就往上套的,哎,程序员也受天朝思想余毒侵害了。。。</div>
<br><br><br>DriverManager 确实是利用ClassLoader来实现的,可能我的表达有误。 <br><br><span style="color: #ff00ff;">JDBC的URL也是一种远程连接,他也是通过自己的“命名域”来获得Connection,JDBC也支持分布式。</span>
</div>
<p>?</p>
<p>URL就是URL,一般都是远处资源的地址。Connection也不是查找获得的,而是创建的。</p>
<p>?你其实想阐述自己的理解,不过别滥用概念。JDBC哪个版本的规范好像也没有说自己支持分布式吧?</p>
<p&g