工廠方法的優缺點?
優點
1. 和構造方法不一樣,靜態工廠方法可以有自己明確的名字。比如newInstance、getInstance、valueOf,可以更明確知道這些方法名字的意思。而構造方法只能通過new類名來創建,比如Person person = new Person()。
2. 不必沒次調用時都創建一個新對象。使用靜態工廠方法對外提供單例,其實就是提前準備好實例,這樣可以重復利用,減少重復創建實例,不過這也需要注意線程安全問題。
3. 可以返回原返回類型的任何子類的對象。這個可以這么理解,例如EnumSet類,EnumSet是抽象類是不能被實例化的,但是可以通過里面的noneOf靜態工廠方法返回它子類的對象,RegularEnumSet和JumboEnumSet都是EnumSet的子類,代碼如下:
public abstract class EnumSet<E extends Enum<E>> extends AbstractSet<E>
implements Cloneable, java.io.Serializable {
EnumSet(Class<E>elementType, Enum[] universe) {}
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
if (universe.length <= 64)
return new RegularEnumSet<>(elementType, universe);
else
return new JumboEnumSet<>(elementType, universe);
}
}
4.在創建參數化類型實例的時候,它們使代碼變得更加簡潔。這條可以這么理解,比如在創建一個Map類型對象時,我們一般可以這么創建:
Map<String, List<String>> m = new HashMap<String, List<String>>();
但是在JDK7以上的版本,泛型參數是可以被推導出來的,所以可以有更簡潔的寫法:
Map<String, List<String>> m = new Hash