Efffective Java(一) 考虑使用静态工厂方法替代构造方法

193 阅读2分钟

正常获取实例的方法:提供公共构造方法(类的构造过程是什么样的???)

可考虑的替代方法:提供公共的静态工厂方法(注:和设计模式的工厂方法模式不完全相同???)

采用静态工厂方法有五个优点:

  1. 静态工厂方法的方法名可自由定义,能提供更明确的信息。如果 public 构造方法中参数多且容易混淆,可以使用静态工厂方法, 将参数的语意信息转换到静态工厂方法的方法名中,形成多个不同的静态工厂方法,突出其的差异。
  2. 不需要每次调用都创建一个新的对象,可实现单例,提高性能。(注:Flyweight 模式,享元模式???Enum 类型就是采用了这种方法)
  3. 静态工厂方法可以返回目标类型的子类(而构造方法只能返回固定类型)。可以目标类型而隐藏具体的实现类,适用接口类型。一个问题是如何组织这些静态工厂方法,一般是将其放到一个抽象的接口类中,例如 Collections 是对各类 List 和 Set 的抽象,将静态工厂方法放到 Collections 中。(什么是伙伴类???)
    List<T> list = new ArrayList<T>; // 依然暴露了实现类 ArrayList
    List<T> list = Collections.emptylist(); // 隐藏类返回的 List 具体实现类型
    
  4. 可以根据输入参数决定返回对象的类型,与优点3 类似,增加了对参数的判断。
  5. 返回的对象的类可配置?在优点3 的基础上提供了注册实现类的功能,而不是将实现类类型硬编码到静态工厂方法中。
    • 在整个过程中有四个角色:服务接口,服务注册 API【通过反射或工厂对象生成服务实例】,服务访问 API,服务实现类。例如 JDBC 中 Connection 是服务接口,DriverManager.registerDriver 是服务注册 API【Driver 是服务工厂方法】,DriverManager.getConnection 是服务访问 API,具体实现类是哪些?。
    • 可以提供比实现类更丰富的接口,桥接模式???
    • java.util.ServiceLoader 一个服务提供者框架???

静态工厂方法的缺点

  1. 没有 public 或 protected 构造方法就无法被子类化???
  2. 在文档中很难找到静态工厂方法

静态工厂方法有一些常用的名称:。。。

OpenJDK OracleJDK ???

一打字就激动???