对于一个类,要获取它的一个实例,通常的做法是提供一个公用的构造函数,然而还有另一种方法,我们称之为静态工厂方法,实质上也就是一个简单的静态方法,它返回一个类的实例。其实,静态工厂方法获取对象实例,我们并不陌生,我们来看看API中的一个实例:
java.lang.Boolean类:
public static Boolean valueOf(boolean b){
return (b ? TRUE : FALSE);
}
返回一个表示指定 boolean 值的 Boolean 实例。如果指定的 boolean 值为 true,则此方法返回 Boolean.TRUE;如果为 false,则返回 Boolean.FALSE。如果不需要新的 Boolean 实例,则应优先使用此方法,而不是构造方法 Boolean(boolean)
,因为此方法有可能大大提高空间和时间性能
基于此,倒不如来探讨一下使用静态工厂方法获取类的实例的优缺点:
优点总结如下:
其一:与构造方法不同,它在被调用的时候,并不一定非得创建新的实例对象。它可以将一个预先创建好的实例缓存起来,当被调用时,就将此对象返回给客户,从而避免创建不必要的重复对象。如果一个程序需要频繁的创建相同的对象,并且创建对象的代价很昂贵,则这项技术可以极大的提高空间和时间性能。
其二:与构造方法不同,静态工厂方法有更清晰的名称表达。例如:BigInteger(int bitLength, int certainty, Random rnd) 它返回的可能是一个素数,然而使用一个如BigInteger.probablePrime的静态工厂方法,表达显然更加清晰。如果一个类,有多个构造方法,并且他们具有相同的原型特征,那么你应该考虑用静态工厂的方法来代替一个或多个构造方法,并慎重的选择它们的名字,以清晰的表达它们的不同。
其三:与构造方法不同,它可以返回一个原返回类型的一个子类对象。这样,我们在选择返回对象类型的时候就有了更大的灵活性。这种灵活性的一个应用时,一个API可以返回一个对象,同时又不使该对象的类成为公有的。以这种方式将具体的实现类隐藏起来,可以得到一个简洁的API。这项技术非常适用于基于接口的框架结构,因为在这样的框架结构中,接口成为静态工厂方法的自然返回类型。
缺点总结如下:
其一:类如果不提供公有的或受保护的构造方法,就不能被子类化。对于这一点,我还没弄得太明白,我觉着这并非静态工厂方法的一个缺点啊,如果一个类只提供了私有的构造方法,即使是通过构造方法也不能将其实例化啊。还望各位指教
其二:它与其他的静态方法并没有两样。它是对规范的一种背离