靜態工廠方法非「工廠方法模式」,僅指回傳類別實例的靜態方法。
建構子名稱固定為類別名,而靜態工廠方法可自訂名稱:
PrimeNumber p1 = new PrimeNumber(int random); // 意圖不明 PrimeNumber p2 = PrimeNumber.newInstance(); // 語意清晰
建構子每次必創建新實例;靜態工廠方法可回傳快取或預先創建的實例,Singleton 模式即基於此原理。
工廠方法可根據參數決定回傳哪個實作類別:
class Father {
private Father() {}
public static Father newInstance(String type) {
if ("ChildA".equals(type)) return new ChildA();
else return new ChildB();
}
private static class ChildA extends Father {}
private static class ChildB extends Father {}
}
Java 7 前需重複泛型參數,工廠方法可利用型別推導:
Map> map = new HashMap >(); // 冗長 public static HashMap newInstance() { return new HashMap (); } // 使用:Map > map = HashMap.newInstance();
super()。valueOf、getInstance、of)以利辨識。靜態工廠方法與公有建構子各有優劣,但前者通常更合適。切勿本能地提供公有建構子,應先評估靜態工廠方法是否更佳。