静态工厂方法讲解:
创建类的实例最常见的就是new语句来调用类的构造方法。在这种情况下,程序可以创建类的任意多个实例,每执行一个new语句,都会导致java虚拟机的堆区产生一个java对象。假如类需要进一步封装创建自身实例的细节,并且控制自身实例的数目,那么就可以考虑静态工厂方法。
静态工厂方法与new语句调用的构造方法相比,有以下区别:
(1):静态工厂的方法名可以任意的,这一特性的优点是可以提高代码的可读性,在方法名中能体现与实例有关的信息。
例如Gender类有两个静态工厂方法:getFemale()和getMale()。
Gender.java
public class Gender{
private String description;
private static final Gender female=new Gender("女");
private static final Gender male=new Gender("男");
private Gender(String description){this.description=description;}
public static Gender getFemale(){
return female;
}
public static Gender getMale(){
return male;
}
public String getDescription(){return description;}
}
这一特性的缺点是与其他的静态方法没有明显的区别,使用户难以识别类中到底哪些静态方法专门负责返回类的实例。为了减少这一缺点带来的负面影响,可以在为静态工厂方法命名时尽量遵守约定俗成的规范,当然这不是必需的。目前比较流行的规范是把静态工厂方法命名为valueOf或者getInstance。
静态工厂方法最主要的特点是:每次被调用的时候,不一定要创建一个新的对象。利用这一特点,静态工厂方法可用来创建以下类的实例。
单例类:只有惟一的实例的类。
枚举类:实例的数量有限的类。
具有实例缓存的类:能把已经创建的实例暂且存放在缓存中的类。
具有实例缓存的不可变类:不可变类的实例一旦创建,其属性值就不会被改变。
但静态工厂方法又有缺点:1. 类如果不含公有的或者default的,就不能被子类化
2.他们跟其它的静态方法实际上没有任何区别。但这可以尽量采用一些家喻户晓的名字解决,让用户看到改名字就知道该方法是静态工厂方法。如getInstance()。