effective java读书笔记-静态工厂

静态工厂方法 static method factory

静态工厂是effective java 中的第一节,本文大部分内容是从上面摘抄的。
static method factory 译为静态工厂模式,指的是类可以提供一个静态工厂方法,一个返回类的实例的静态方法。

public static final Boolean FALSE = new Boolean(false);
public static final Boolean TRUE = new Boolean(true);

public static Boolean valueOf(boolean b) {
    return (b ? TRUE : FALSE);
}

public Boolean(boolean value) {
    this.value = value;
}

在java8 中前者为静态工厂创建对象,后者为构造方法创建对象。

那么静态工厂的优点

1.静态方法在方法命名上更具备可读性
用构造方法创建对象的时候,传递不同的参数生成不同类型的对象。但是这并不明显,若不去查看api我们不能看出构造方法创建的到底是哪些对象。而且静态工厂可以在方法上作特征对象的命名。

2.静态方法参数的灵活性
与上述的优点相同,使用构造方法创建不同类型对象时会出现这样一个问题。当我们需要相同类型的参数,创建不同类型的对象,这个问题导致构造方法极其难使用。如果使用静态方法我们完全可以在方法名上进行区别。

3.不必每次调用的时候都创建新的对象
我们可以利用静态工厂对常用的单例的对象进行缓存。
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
每次调用valueOf()的时候并不会创建新的对象而是使用缓存中的Boolean对象,这样对类的实例有很好的控制权利,但是要保证类是线程安全的并且单例的。

4.静态工厂可以返回类的任何子类型
这优点实在是太好啦,api可以返回对象,却不需要将类的构造公有化(公有化子类就可以),以这种隐藏构造子类代码的方式可以使api对外部变的非常简洁,特别适用于服务提供者框架中进行解耦。

private static final Map<String,Provider> providers = new ConcurrentHashMap<String, Provider>();
static{
    providers.put("xml",new XMLProvider());
    providers.put("json",new JSONProvider());
}

private ServiceFactory(){

}

public Service getService(String type){
    return providers.get(type).newService();
}    

在这个factory中,外界只需要给出需要的类型,完全不需要关注其service是如何创建的,创建何种类型,甚至可以做到外部只关注获得Service接口,外部面向接口进行编程。从而降低代码的耦合程度。