对于类而言,为了让客户端获取它资深的一个实例,最常用的方法就是提供一个共有的构造器。还有一种放你发,也应该子每个程序员的工具箱中占有一席之地。类可以提供一个共有的静态 工厂方法,它只是返回类的实例的静态方法。
类可以通过静态工厂方法类提供它的客户端(对象),而不是通过构造器。提这样做的好处有:
1.静态工厂方法与构造器不同的第一大优势在于,它们有名称.比如构造器BigInteger(int,int,Random)返回的BigInteger可能为素数,如果用名为BigInteger.probablePrime的静态工厂方法来表示,显然更为清楚。当一个类需要多个带有相同签名的构造器时,就用静态工厂方法代替构造器,并且慎重地选择名称以便突出它们之间的区别。
2.静态工厂方法与构造器不同的第二大优势在于,不必再每次调用它们的时候都创建一个新对象。这个具体不说了,可以看下单例模式。
3.静态工厂方法与构造器不同的第三大优势在于,它们可以返回原返回类型的任何子类型的对象。这项技术适用于基于接口的框架。使用这种静态方法时,甚至要求额客户端通过接口来引用被返回的对象,而不是通过它的实现类来引用被返回的对象,这是一种良好的习惯。
4.静态工厂方法的第四大优势在于,在创建参数化类型的实例的时候,它们使代码变得更加简洁。
缺点:
静态工厂方法的主要缺点在于,类如果不含有共有的或者受保护的构造器,就不能被子类化。
静态工厂方法的第二个缺点在于,它们与其他的静态方法实际上没有任何区别。在API文档中,它们没有像构造器那样明确标识出来。因此,对于提供了静态工厂方法而不是构造器的类来说,要想查明如何实例化一个类,这是非常困难的。不过你通过在类或者接口注释中关注静态工厂,并遵守标准的命名习惯,也可以弥补这一劣势。下面是一些惯用名称:
valueOf
of
getInstance
newInstance
getType
newType
简而言之,静态工厂方法和共有构造器都各有用处,我们需要理解它们各自的唱出。静态工厂通常更加合适,因此切忌第一反应就是提供公有的构造器,而不先考虑静态工厂。
Effective java读书札记第一条之 考虑用静态工厂方法代替构造器,布布扣,bubuko.com