问题描述
以下代码来自Apache Http Client。
HttpClientBuilder.java
public class HttpClientBuilder {
public static HttpClientBuilder create() {
return new HttpClientBuilder();
}
protected HttpClientBuilder() {
super();
}
}
在这里,创建静态方法以获取实例的目的是什么?为什么不使用公共构造函数?为什么要在构造函数中调用super()
?
解决方法
如果要使用HttpClientBuilder
的新实例的代码本身通过构造函数创建了对象,那么它将永远更多地精确地创建该类型的对象,并将锁定它传递的某些参数集到构造函数。
工厂方法create
具有更大的灵活性。如图所示,它无论如何都返回HttpClientBuilder
。但是说些改变,HttpClientBuilder
的作者希望在某些情况下返回HttpClientBuilder
的特殊新子类。使用factory方法,他们可以做到这一点,并且无需更改任何客户端代码,甚至都不知道其中的区别。在直接调用构造函数的情况下,如果不更改客户端代码就无法进行该更改。因此,与直接调用构造函数相比,工厂方法通常具有更大的灵活性,可供类的作者将来进行修改。