1 抽象工厂方法优于构造器

2019-01-11  本文已影响0人  老段来了快跑

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》

上一篇下一篇

猜你喜欢

热点阅读