● 优先考虑静态工厂方法代替构造器
优势(原因):
① 自定义名称(★★)
构造器参数本身没有很好的确切描述返回的对象,客户端程序员不容易记住该用哪个构造器。但是静态工厂方法有名字,如:Module.SimpleModule(),可以明确知道得到一个默认的对象。
【注意:若仅仅是替代构造器,比如重载方法 newInstance() 和 newInstance(int,int),则其实存在和构造器类似的问题,并无法体现静态工厂方法有名称的优异性】
②不必每次都创建新对象(★★★)
相对于构造器每次都new一个对象,静态工厂方法可以使已经构建好的实例对象,例如:(1)Boolean.value(boolean),从不创建对象;(2) String,数据库连接池等享元模式。
【注意:采用静态工厂方法返回相同的重复对象,应保证对象不可修改或不提供修改对象属性的方法(final无法保证对象属性不被修改)。参考String、Date、BigDecimal】
不适用于JavaBean,即便是创建默认的空数据,也存在个别属性值不同。
③可以返回原返回类型的任何子类型的对象(多态)(★★★)
API可以返回实现接口的对象,同时又不暴露对象的类(方便扩展)。
【基于接口的框架,接口(非类)为静态工厂方法返回类型,因为接口不能有静态方法,按照惯例,接口Type的静态工厂方法被放在一个名为Type的不可实例化中的伴生类中(Collection和其伴生类Collections)。注意:返回的对象的实际类可以多种类型的】
④ 所返回的对象的类可以随着每次调用而发生变化,这取决与静态工厂方法的参数值:(★★)
同3类似,返回的类型可以由方法自身决定,不需要暴露实际类型。
⑤方法返回的对象所属的类,在编写包含该静态工厂方法的类时可以不存在(★★★)
典型:服务提供者框架(Service Provider Framework)的基础,例如JDBC API。
网友评论