01_考虑用静态工厂方法代替构造器

来源:互联网 发布:驱动精灵mac版下载 编辑:程序博客网 时间:2024/06/05 06:39

  看到静态工厂方法,我首先想到的就是Java设计模式中的工厂模式,相信很多人都和我一样,但是在书中很明确的说明:

注意,静态工厂方法与设计模式中的工厂方法模式不同。本条目中所指的静态工厂方法并不直接对应于设计模式中的工厂方法。

  静态工厂方法替代构造器的优势:

  1. 他们有名称
      例如:BigInteger(int,int,Random)返回的BigInteger可能为素数,如果采用BigInteger.probablePrime的静态工厂方法来表示,更加的清晰明了。
       一个类只能有一个带有指定签名的构造器。要想避开这个,无非就是让参数列表在顺序上有所不同,而这就会导致程序员面对这样的API时,很难将其记住,从而导致误操作。
      由于静态工厂方法能够明确的对其进行区分,就不会造成这种误操作。

  2. 不必在每次调用他们的时候都创建一个新对象

    • 避免创建不必要的重复对象,提升性能
    • 严格控制在某个时刻哪些实例应该存在
    • 实例受控可以确保它是一个Singleton或者不可实例化的
    • 不可变类可以确保不会存在两个相等的实例,即当且仅当a==b时才有a.equals(b)为true
    • 如果确保上述一点,则可以利用==来代替equals提升性能
    • 枚举类型保证了这一点。
  3. 它们可以返回原返回类型的任何子类型对象
      想必这个就不用多说了,子要是子类型的都可以返回。

  4. 在创建参数化类型实例的时候,它们使代码变得更加简介
Map<String,List<String>> m = new HashMap<String,List<String>>();

  简化版本

public static <K,V> HashMap<K,V> newInstance(){    retrun new HashMap<K,V>();}

  静态工厂方法替代构造器的缺点

  1. 类如果不含有公有的或者受保护的构造器,就不能被子类化
  2. 他们与其他的静态方法实际上没有任何区别

0 0
原创粉丝点击