先看代码,这是boolean包装类Boolean,其内部就有静态工厂方法。
public final class Boolean {
public static final java.lang.Boolean TRUE = new java.lang.Boolean(true);
public static final java.lang.Boolean FALSE = new java.lang.Boolean(false);
public static java.lang.Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
}
静态工厂方法优点
工厂方法有方法名,通常我们都是通过重载构造器的方式构造不同的对象,有时我们可能传入同样的参数,但其他参数的默认值不同,这时构造器就不能满足我们要求。而且参数过多容易导致错误,也不容易理解,静态方法名能描述要被返回对象,更易于使用。
不必每次都创建一个新对象,静态工厂方法能够为重复的调用返回相同对象,如Boolean,其内部有两个预先定义好的常量(TRUE,FALSE),当我们调用Boolean.va lueOf (b oolean )时会得到其中一个,不会每次都创建一个新对象,这样有助于类总能严格控制在某个时刻哪些实例应该存在,也会提高性能。
它们可以返回原返类型的任何子类型的对象,这样在选择返回对象的类型时就灵活很多,如:java.util.Collections。
所返回的对象的类可以随着每次调用而发生变化,这取决于静态工厂方法的参数值。
方法返回的对象所属的类,在编写包含该静态工厂方法的类时可以不存在 这。
静态工厂方法的缺点
类如果不含公有的或者受保护的构造器,就不能被子类化。 这也不全是缺点,因为我们在写代码是要多用组合,少用继承。
静态工厂方法不容易被发现, 当我们要创建一个类的对象时,要有意识地在该类搜索静态工厂方法。
静态工厂方法的常用名称
from一一类型转换方法,它只有单个参数,返回该类型的一个相对应的实例,例如:
Dated= Date om(i 1stant) ;
of 聚合方法,带有多个参数,返回该类型的一个实例,把它们合并起来,例如
Set<Rank> faceCa ds = EnumSet. of (JACK , QUEEN, KING];
valueOf一一比 from of 更烦琐的 种替代方法,例如
Bigintege me = Bigintege .valueOf(Intege .MAX_VALUE);
instance 或者 get Instance -返回的实例是通过方法的(如有)参数来描述的,但是不能说与参数具有 同样的值,例如
StackWalke luke = StackWalke .getinstance(options);
create 或者 new nstance一一才象 instance 或者 getinstaηce 样,但 create或者 new st ance 能够确保每次调用都返回一 新的实例 ,例如:
Object newA 「「 ay = 「「 ay.ne instance(classObject, 「「 aylen 〕;
get Type- get Ins taηce 样,但是在工厂方法处于不同的类中的时-候使Typ 表示工厂方法所返回的对象类型,例如:
FileSto fs = Files.getFileStore(path];
newType一寸’象 ewinst an ce 样,但是在工厂方法处于不同的类中的时候使用Type 表示工厂方法所返回的对象类型,例如:
Buffe edReade 「= Files.newBuffe edReade path);
type-一-get ype new Type 的简版,例如:
List<Complaint> litany ζollections.list(legacylitany〕;
简而言之,静态工厂方法和公有构造器都各有用处,我们需要理解它们各自的长处静态工厂经常更 合适,因 切忌第一反应就是提供公有的构造器, 不先考虑静态工厂
网友评论