类可以通过静态工厂方法提供给他的客户端,这样做有几大好处:

  1. 静态工厂方法有名称:如果构造器的参数本身没有确切的描述正被返回的对象,具有适当名称的静态工厂方法会更容易使用,产生的客户端代码也更容易阅读。例如:构造器BigInteger返回的BigInteger可能为素数,如果使用名为BigInteger.probablePrime的静态工厂方法表示,更加清楚一些。
  2. 不用再每次调用它们的时候都创建爱你一个新对象:这使得不可变类可以使用预先构建好的实例,或者将构建好的实例缓存起来,进行重复使用,从而避免不必要的重复对象。Boolean.valueOf(boolean)说明了这项技术:它从来不创建对象。如果程序经常请求创建相同的对象,并且创建对象的代价很高,这项技术可以大大提升性能。
  3. 它们可以返回原返回类型的任何子类型的对象:在选择返回对象的类是有了更大的灵活性。(灵活性的一种应用是,API可以返回对象,通知又不会使对象的类编程共有的。这样的方式隐藏实现类会使API变得更加简洁,这项技术适用于基于接口的框架,以为在这种框架中,接口为静态工厂方法提供了自然返回类型。)
    共有的静态工厂方法所返回的对象的类型不仅可以是非公有的,而且该类还可以随着每次调用而发生变化,这取决于静态工厂方法的参数值,只要是已经声明的返回类型的子类型,都是允许的。为了提升软件的可维护性,返回对象的类也可以随着发行版本的不用而不同
  4. 静态工厂方法返回的类在编写该静态工厂方法时,可以不存在:更加灵活。
  5. 在创建参数化类型实例的时候,使代码变得更加简洁
    例如,HashMap提供了下面这静态工厂:
public static <K,V> HashMap<K,V> new Instance(){
	return new HashMap<K,V>();
}

可以使用下面这简洁的代码来创建一个HashMap对象:

Map<String,List<String>> m = HashMap.newInstance();

而不用繁琐地写成:

Map<String,List<String>> m = new HashMap<String,List<String>>();

静态工厂方法的主要缺点:

  1. 类如果不含共有的或者受保护的构造器,就不能被子类化