Static Factory Method

採用 static factory method 來建立物件,比起使用傳統的建構子來建立物件的好處有幾點:

  1. static factory method 具有方法的名稱,使用傳統建構子來建立物件,若其參數未能很好的描述該建構子所回傳的物件,那麼使用一個良好命名的 static factory method,對於 client end 的程式碼來說會是較易於使用且可讀性較好的。
  2. 可以省略語法上的累贅,譬如:HashMap<String, String> map = new HashMap<String, String>這段語法,從 map 變數型態的宣告上,便可得知應建構出何種型態的物件,在建構子的部份實在無需重複如此型態的宣告。若是今天遇上結構較為複雜的型態時,譬如:
    List<HashMap<String, ArrayList<HashMap<String, Integer>>>> param = new List<HashMap<String, ArrayList<HashMap<String, Integer>>>>
    
    這種結構時,在程式碼的可讀性以及維護性上都會大打折扣。 而透過 static factory method 的方式來實作的話,客戶端在呼叫時的程式碼,可以改寫成如:
    //This is actually what the library, Google Guava, does.
    
    HashMap<String, String> map = Maps.newHashMap();
    

常見的 static factory method 的命名方式:

  • valueOf:回傳一個帶有 相同傳入值 的物件,適合用來作 型態轉換
  • of:一個更為精簡的命名方式,基本上與 valueOf 相同,可以在 EnumSet 中見到
  • getInstance:取得一個被傳入參數所描述的 instance,不過不能說他們具有相同的值。以 singleton 模式來說,getInstance 未帶任何參數,並且回傳一個 唯一的 instance
  • newInstance:基本上與 getInstance 相同,但確保由該方法所產生的 instance,皆與其他 instance 不同。
comments powered by Disqus