使用构造方法前考虑一下静态工厂方法
请注意,这里所说的工厂方法和设计模式中所说的工厂方法是不同的,这里说的静态工厂方法例如:
public static User getUserInstance(){
return new User();
}
如此看来和普通的构造方法没有什么区别,但仔细分析有以下四个优点:
1、静态工厂方法是有名字的,这一点对于提高开发效率至关重要。
将上面的例子延伸,如果User类有两个构造方法User(String id)和User(String name,String status),那么在构造User对象时就容易发生混淆。而使用静态工厂方法就避免了这种误会,如:
public static User getUserById(String id){
return new User(id);
}
public static User getUserByNameStatus(String name,String status){
return new User(name,status);
}
2、可以实现单体访问,举个例子说明:
public class ConfigFactory{
private static SystemConfig sc = null;
public static SystemConfig getSystemConfig(){
if(sc==null)
sc = new SystemConfig();
return sc;
}
}
3、静态工厂方法返回的对象可以是定义的类,也可以是其子类,这是构造函数做不到的,不用举例子了。
4、使用静态工厂方法优化泛型使用,减少代码重复,一般情况下,我们使用泛型采用:
Map<String, List<String>> m = new HashMap<String, List<String>>();
的方式,使用静态工厂方法,我们可以写成:
public static <K, V> HashMap<K, V> newInstance() {
return new HashMap<K, V>();
}
调用的时候,直接使用:
Map<String, List<String>> m = HashMap.newInstance();
即可。
可惜的是,截至JDK1.6为止,HashMap也没有提供这种方法,我们只能将此写在自己的工具类里。
当然这样做也不是有百利而无一害的,缺点是:
1、如果我们将一个类的构造方法指定为私有,只对外提供一个静态工厂方法的话,这个类将是无法继承的。
2、静态工厂方法将和普通方法在一起出现在javadoc中,而不会像构造方法一样被单独展示在一起,这样会造成文档阅读的不便。
上述介绍,不是让您在创建类时,摒弃构造方法,只使用静态工厂方法,而是让您在使用构造方法前,多考虑一种静态工厂方法的实现方式。而已。