1. 考虑用 静态工厂方法 而不是构造器
有这五个优点:
- 有方法名
- 不用每次都创建对象
- 可以返回任意子类
- 可以根据不同的入参而返回不同的类
- 在编写包含方法的类时,返回对象的类不需要存在
A. 有方法名
这个优点确实很显眼 ,毕竟构造器名固定了🐖
B. 不用每次都创建对象
这个也好理解,可以缓存对象, 设计思想上可参考 亨元设计模式
例如 valueOf 方法 👇
C. 可以返回任意子类
这个作者举了 Collections 这个工具类,但是我也没啥特别的感觉,感觉和 面向接口编程 差不多的意思
D 可以根据不同的入参而返回不同的类
这个可以参考 Spring 中 BeanFactory 接口的 getBean 方法。
这个我便轻车熟路了,它可以很对业务模块进行解耦,方便扩展
接口A a = applicationContext.getBean(参数);
a.common();
复制代码
E. 在编写包含方法的类时,返回对象的类不需要存在
这个还是 面向接口编程 好吧……
作者举了 JDBC 这个例子。
Connection conn=DriverManager.getConnection(xxx)
2. 如果构造器有很多参数,建议用 builder 去创建对象
这个就是 建设者模式 的使用了,下面是作者 Joshua Bloch 在 GitHub 仓库给的例子
package effectivejava.chapter2.item2.builder;
// Builder Pattern (Page 13)
public class NutritionFacts {
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate;
public static class Builder {
// Required parameters
private final int servingSize