靜態工廠方法比較簡單, 與其說是設計模式, 倒不如認爲是一個工具類(utils).
靜態工廠方法的實現是使用靜態方法, 目的也是爲了避免構造函數過多而引起的可讀性下降, 以Java8中的LocalDate爲例:
public class Demo {
public static void main(String[] args) {
LocalDate.of(2017, 12, 12);
LocalDate.now();
}
}
有時候, 當靜態工廠過於氾濫時, 我們希望能夠把靜態方法集中起來, 作爲一個抽象層次較高的工具類, 比如說Collections類:
public static void CollectionsDemo(String[] args) {
List<Object> list = Collections.emptyList();
Map<Object, Object> map = Collections.emptyMap();
}
這兩種形態的靜態工廠方法都是可取的, 更多的情況下取決與使用習慣以及設計等.
在Nutz中可以直接使用類似於表達式的方法調用靜態工廠方法並注入到相應對象中:
@IocBean(factory="net.wendal.mqtt.MqttAbcServiceFactory#create", args={"refer:dao"})
public class AbcService extends Service {
...
}
// 無任何註解
public class MqttAbcServiceFactory {
public static AbcService create(Dao dao) {
return new XXXXAbcService(dao);
}
}
靜態工廠的方法存在的意義該是爲了提高代碼的可讀性以及避免重複的代碼, 如果你的代碼中出現了過多的靜態方法, 那就要考慮你是否退回到了結構化編程的老路了.