Java中级篇之静态工厂方法代替构造器

这里的静态工厂方法并不是设计模式中的工厂方法,只是类中的一个静态方法,这个方法的主要作用就是通过调用类的构造器来返回类的实例。
这样做有以下几个优势:
第一大优势:它们有名称
如果希望一个类能通过不同的参数来实例化,那么用公有构造器只能通过构造器的重载来实现,这样在实例化的时候就需要谨慎仔细的鉴别输入参数。如果使用静态工厂方法的话,就可以在方法名称上加以区分,方便使用。

public class A{
	private Stirng a;
	private A(String a){this.a=a;}
	public static A getInstance(String a){return new A(a);}
}

第二大优势:不必在每次调用它们的时候都创建新对象
这要根据具体的需求来实现,比如在单例模式中,调用静态工厂方法时,如果该对象已经存在则返回该对象的引用,如果该对象不存在则创建对象实例并返回。

public class Singleton{
	private static Singleton singleton;
	private Singleton(){}
	public static Singleton getInstance(){
		if(singleton==null){singleton=new Singleton();}
		return singleton;
	}
}

第三大优势:他们可以返回原返回类型的任何子类对象
这个可以理解为父类类型指向子类对象,这种灵活性的一个应用就是:API可以返回对象,同时有不会使对象的类型变成公有的,隐藏了实现类可以让API变得非常整洁。

第四大优势:返回对象的类可以随着每次调用而发生变化,这取决于静态工厂方法的参数值
比如EnumSet类型的实例,就是根据静态方法传入的参数值返回不同的版本,如果元素个数小于64,就返回RegalarEnumSet实例,用单个long支持。如果大于65个,则返回JumboEnumSet实例,用long数组支持。

第五大优势:方法返回的对象所属类,在编写包含该静态工厂方法的类时可以不存在
这种灵活用则用于构成服务者提供框架,例如JDBC API。

主要缺点一:类如果不含公有的或者受保护的构造器,就不能被子类化。
换句话说,如果构造器都被隐藏之后,该类就不能被继承了。

主要缺点二:静态工厂方法不容易被发现
由于方法名只要符合语法规范的话就可以任意取名,那么不看说明的话就很难发现它们,所有在使用静态工厂方法时,一般要遵守标准的命名习惯。
instance或者getInstance。creat或者newInstance与前面的类似,但是更倾向于返回一个新的实例。

总而言之,静态工厂方法和公有构造器都各有用处,我们需要理解他们各自的长处。静态工厂经常更加合适,因此,切忌第一反应就是提供公有构造器,而不先考虑静态工厂。

参考文献:《Effective Java》[美] Joshua Bloch 著

菜鸟手书,欢迎指正!

你可能感兴趣的:(Java)