2.优点的体现
Effective Java中共提到好处四点:
1、它们有名称
2、它们可以返回原返回类型任意子类型的对象。
针对于第一点,相比较于与类名相同的构造函数,静态工厂方法是通过静态方法进行对象的初始化,其方法名字自然可以自定义,从而帮助开发人员的理解,这是容易理解的。例如:构造器BigInteger(int,int,Random)返回的BigInteger可能为素数,如果改名为 BigInteger.probablePrime的静态方法表示,显然更为清楚。
对于第二点没看明白,摘自网络:
第二点,其在Java中的集合类Collections用的颇多,主要利用Java的多态的特性,使得工厂可以产生基类的同时注入子类实现。如:
public interface Food {
/**
* 使得所有食物都有一个共有的introduce方法
*/
public void introduce();
}
/**
* 定义食物的子类:鱼
*/
public class Fish implements Food{
@Override
public void introduce() {
System.out.println("i am a fish");
}
}
/**
* 食物的子类,水果
*/
public class Fruit implements Food {
@Override
public void introduce() {
System.out.println("i am the fruit");
}
}
/**
* 通过反射机制实现的工厂
*/
public class FoodFactory {
public static Food getFood(String type) {
Food food = null;
try {
food = (Food) Class.forName("info.zhw." + type).newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return food;
}
}
FoodFactory就利用了基类,返回了该类型的子类型。
3、不必在每次调用他们的时候都创建一次对象。
这使得不可变类可以使用预先构建好的实例,或者将构建好的实例缓存起来,进行重复利用,从而避免了创建不必要的重复对象。Boolean.valueOf(boolean b)方法说明了这项技术,它从来不创建对象。
/**
* Returns a {@code Boolean} instance for the specified boolean value.
* <p>
* If it is not necessary to get a new {@code Boolean} instance, it is
* recommended to use this method instead of the constructor, since it
* returns its static instances, which results in better performance.
*
* @param b
* the boolean to convert to a {@code Boolean}.
* @return {@code Boolean.TRUE} if {@code b} is equal to {@code true},
* {@code Boolean.FALSE} otherwise.
*/
public static Boolean valueOf(boolean b) {
return b ? Boolean.TRUE : Boolean.FALSE;
}
/**
* The {@code Boolean} object that represents the primitive value
* {@code true}.
*/
public static final Boolean TRUE = new Boolean(true);
/**
* The {@code Boolean} object that represents the primitive value
* {@code false}.
*/
public static final Boolean FALSE = new Boolean(false);
使用构造函数,调用其中的方法,则实例化一个类是必不可少的步奏,而是使用静态工厂方法,则可以对对象进行重复利用,这个特点在单例模式中使用颇多。其将构造方法私有,只能通过getInstance()获取实例,从而达到实例重复利用的目的。
4、使代码简洁
与第一点有点雷同,主要也是在方便理解的基础上作出的改进。
3.缺点从何体现
1、如果类不含有公有或受保护构造器,就不能被子类化。
2、和静态方法实际上没有任何区别。其无法在API文档中明确标出,推荐使用管用名称管理。
下面是 静态工厂方法的一些惯用的名称:
valueof,getInstance,newInstance,getType,newType 等等