コンストラクタの代わりにstaticなファクトリメソッドの適用を考える

コンストラクタと違って下記の利点がある。

  1. 名前をつける事が出来る
    • どんな状態のインスタンスを取得できるかメソッド名で判断させる事が出来る
  2. 毎回インスタンスを生成しなくてもいい
    • Flyweightパターンに似ている
    • コントロールされたインスタンスを渡す事が可能
    1. Singletonなインスタンス
    2. インスタンス化が禁止されたクラスのインスタンス
    3. 不変なクラスのインスタンス
  3. どんなサブクラスのインスタンスでも返すことが出来る
  4. インスタンスを作る際にTypeParameterを繰り返さずに済む

但し、下記の欠点も挙げられる。

  1. publicでないクラス、またはprotectedなコンストラクタはサブクラス化する事が出来ない
    • 但し、継承(is+a)の変わりにコンポジション(has+a)を使用することの薦めになる
  2. ファクトリメソッドだと言う事に気づきにくい
    • 他のstaticメソッドと混ざってしまう
      • 名前を特徴付ける事によって改善する事が出来る
        • valueOf
        • of
        • getInstance
        • newInstance
        • getTypeName
        • newTypeName