刚开始看这本书我就确定是本好书,因为第一条我就没看明白。
我把原因归罪于隔壁工位运维的孩子们,打电话的声都快盖过我耳机里的声音了。
后来看了下jdbc的源码,才真正把文字和思想还有实现联系起来。
创建和销毁对象:
第一条:考虑用静态工厂方法代替构造器
书里一共列出了四大优势,让我眼前一亮的是第三个:“可以返回原返回类型的任何子类型的对象”
以jdbc为例,就是把各种“Connection服务接口类型的示例放到一个“容器”里,然后提供一个接口(静态工厂方法),客户端通过连接串就可以得到相应的connection。
这样就可以解耦出来了,让使用Connection实例的时候,无需关心实现Connection的类如何变化。
以个人愚见分析一下源码中的模型和过程:
下面是一段我们熟的不能再熟的得到连接的代码:
/**
Connection:服务接口
DriverManager.getConnection():静态工厂方法,返回值Connection
**/
Class.forName("com.hxtt.sql.access.AccessDriver");
String strurl = "jdbc:access:/D:/DATA.MDB";
con = DriverManager.getConnection(strurl);
首先,Class.forName 方法用JNI的方式,根据“com.hxtt.sql.access.AccessDriver”调用出驱动的class
然后,DriverManager.getConnection 的执行:
1、比较driver的name,如果不同抛出异常
2、调用driver中的connect方法,返回参数为:Connection,如果为null则抛出异常
3、返回Connection
这样即使Connection的类结构有任何变化,客户端也不用去做任何的修改。
静态工厂方法的其他优势:
(1)静态工厂方法有名称。同一个类的不同构造器只是在有无参数、参数长短和顺序的不同。而静态工厂方法可以根据用法自定义名称。
(2)在创建参数化类型实例的时候,可以简化代码。
如Map<String , List<String>> m=new HashMap<String, List<String>>(); //构造器需要两次提供类型参数
Map<String , List<String>> m = HashMap.newInstance(); //静态工厂方法利用了类型推导,变压器替你找到参数类型
(3)不必在每次调用静态工厂方法的时候都创建一个新的对象。
静态工厂方法能够为重复的调用返回相同的对象。 如果去报不会纯真两个相等的实例,即当且仅当a==b的时候才有a.equals(b)为true,那么可以利用a=b来代替a.equals(b)来提高性能。