home wiki.fukuchiharuki.me
Menu

キーワード

  • インスタンス
    • 生成
      • パラメータ

何か

組み立て屋さん

インスタンスを生成するために必要なパラメータをもつビルダークラスを別途設けます。このビルダークラスのオブジェクトはパラメータ(ビルダーの属性)を使用することで対象のインスタンスを生成して完全な状態にします。

Effective JavaでいうところのビルダーパターンとGoFが提唱するビルダーパータンは別のものです。ここでは前者を挙げています。

後者の特徴はDirectorがインスタンス生成のための手順をもっていることです。単に複数のパラメータが必要であるということだけではない手順です。調理法が定まっていて材料を変えることができるイメージです。

なぜか

引数が多すぎるとコードの見通しが悪くなります。コンストラクタについても同じことが言えます。ビルダーにインスタンスの生成責務を預けることでコンストラクタの引数が多くなり過ぎる問題を解決できます。また、インスタンスを生成するためのインタフェースを特定しませんから、ビルダーがパラメータに応じて柔軟にインスタンスの生成パターンを変更することができます。

  • コンストラクタの過剰なパラメータ数を回避
  • クライアント側から生成パターンを特定しない

どのように

User {

  Builder {

    // required
    private name;

    // optional
    private gender;

    public Builder(name) {
      this.name = name;
    }

    public setGender(gender) {
      this.gender = gender;
      return this;
    }

    public build() {
      /*
       * ここでパラメータの整合性チェックをする
       * (チェックエラーの場合IllegalArgumentExceptionを投げるなど)
       */
      User user = new User();
      user.name = this.name;
      user.gender = this.gender;
      return user;
    }

  }

  private name, gender;
  private User(){}

}
Client {
  do() {

    User user = new User.Builder("fukuchi").setGender("male").build();

  }
}

関連

参考