
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
昆明达内的老师这一期给大家讲考虑用静态工厂方法代替构造器。
对于类而言,最常用的获取实例的方法就是提供一个公有的构造器,还有一种方法,就是提供一个公有的静态工厂方法(static factory method),返回类的实例.
提供静态工厂方法而不是公有构造,这样做有几大优势:
静态工厂方法有名称.可以更确切地描述正被返回的对象.
当一个类需要多个带有相同签名的构造器时,可以用静态工厂方法,并且慎重地选择名称以便突出它们之间的区别.
不必在每次调用它们的时候都创建一个新对象.可以重复利用实例.如果程序经常请求创建相同的对象,并且创建对象的代价很高,这项改动可以提升性能. (不可变类,单例,枚举).
可以返回原类型的子类型对象.适用于基于接口的框架,可以隐藏实现类API,也可以根据参数返回不同的子类型.
由于接口不能有静态方法,因此按照惯例,接口Type的静态工厂方法被放在一个名为Types的不可实例化的类中.
(Java的java.util.Collections).服务提供者框架(Service Provider Framework,如JDBC)的基础,从实现中解耦.
在创建参数化类型实例的时候,使代码更简洁.
静态工厂方法的缺点:
类如果不含public或者protected的构造器,就不能被子类化.对于公有的静态工厂方法所返回的非公有类,也同样如此.
静态工厂方法与其他的静态方法没有区别.在API文档中没有明确标识出来.可以使用一些惯用的名称来弥补这一劣势:
valueOf():类型转换方法,返回的实例与参数具有相同的值.
of(): valueOf()的一种更简洁的替代.
getInstance():返回的实例通过参数来描述,对于单例来说,该方法没有参数,返回唯一的实例.
newInstance():像getInstance()一样,但newInstance()能确保返回的每个实例都与其他实例不同.
getType():像getInstance()一样, Type表示返回的对象类型,在工厂方法处于不同的类中的时候使用.
newType():和newInstance()一样, Type表示返回类型,在工厂方法处于不同的类中的时候使用.