静态工厂方法构造对象优缺点

来源:互联网 发布:北大西洋公约知乎 编辑:程序博客网 时间:2024/06/07 01:42

对于一个类,要获取它的一个实例,通常的做法是提供一个公用的构造函数,然而还有另一种方法,我们称之为静态工厂方法,实质上也就是一个简单的静态方法,它返回一个类的实例。其实,静态工厂方法获取对象实例,我们并不陌生,我们来看看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。这项技术非常适用于基于接口的框架结构,因为在这样的框架结构中,接口成为静态工厂方法的自然返回类型。
缺点总结如下:

其一:类如果不提供公有的或受保护的构造方法,就不能被子类化。对于这一点,我还没弄得太明白,我觉着这并非静态工厂方法的一个缺点啊,如果一个类只提供了私有的构造方法,即使是通过构造方法也不能将其实例化啊。还望各位指教

其二:它与其他的静态方法并没有两样。它是对规范的一种背离

原创粉丝点击