1 抽象工厂方法优于构造器
1抽象工厂的优点(相对于构造器)
1.1 名字
抽象工厂方法(以下简称“AFM(abstract factory method)”),AFM的方法名可以任意设置,而构造器只能用类名。在如下场景,AFM显出优势:
BigInteger i = BigInteger.probablePrime(3, r);//生成素数(只能被自己和1整除)
上述代码可以清晰表达,获取素数。如果采用构造器new BigInteger(),就不能表达素数的含义。
1.2 不需要一定要创建个新的对象
Boolean b = Boolean.valueOf(true);
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
ValueOf()返回的是一个创建好的 final static Boolean 对象,并没有新创建对象,提升了效率
1.3 返回的对象可以是子类
Set<Object> set = Collections.newSetFromMap(new HashMap<Object, Boolean>());
Collections.newSetFromMap()上述接口返回类型是set,但是实际返回对象的类,是SetFromMap类。SetFromMap类是 Collections类的内部私有类,这样就影藏了SetFromMap,让包更简洁。
1.4 按照参数返回不通对象
EnumSet<Color> s = EnumSet.of(Color.RED, Color.GREEN)
根据参数的数量,返回不通对象。小于等于64个时,返回RegularEnumSet。大于64时,返回JumboEnumSet,从达到最优的效率。
1.5 返回的对象类,可以延迟实现
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/imooc",USER,PASSWORD);
Connection 是oracle.jdbc.driver.OracleDriver里实现的,是在调用过程中传入的,
2. 抽象工厂方法的缺点
2.1 构造器私有,不能被继承
2.2 文档中,抽象方法混在一般方法中,比较难找到
内容来自《effective java 3rd version》