Builderパターンの解説

Builderパターンとは、複雑なオブジェクトの生成過程を簡単にするために、一つずつ段階を踏んで作成するデザインパターンだ。これにより、オブジェクトの作り方を柔軟に変更できる。

たとえば、ハンバーガーを作るとき、パン、肉、野菜などを組み合わせて好みのハンバーガーを作れるようにするのがこのパターンだ。

では、サンプルコードを一緒に見ていこう。

解説

例えば、ハンバーガーを作る工場を考えてみよう。ハンバーガーにはパン、肉、レタス、チーズなどの材料があって、それらを組み立てる必要があるよね。Builderパターンでは、一つ一つの部品(材料)を組み立てながら、最終的に完成したハンバーガーを作るイメージだ。

Step 1: ハンバーガーのクラスを作る

まず、ハンバーガーの各パーツを持つ「ハンバーガー」クラスを作るよ。パンや肉、チーズ、レタスが入るかどうかを設定できるようにするんだ。


// ハンバーガーのクラス
class Hamburger {
  constructor() {
    this.bread = null;
    this.meat = null;
    this.cheese = null;
    this.lettuce = null;
  }

  show() {
    console.log(`パン: ${this.bread}, 肉: ${this.meat}, チーズ: ${this.cheese}, レタス: ${this.lettuce}`);
  }
}
      

Step 2: ハンバーガーを組み立てるためのBuilderクラスを作る

次に、ハンバーガーを組み立てるためのBuilderクラスを作るよ。このクラスでは、各材料を追加するメソッドを用意して、最終的に完成したハンバーガーを返すことができるようにするんだ。


// ハンバーガーを組み立てるBuilderクラス
class HamburgerBuilder {
  constructor() {
    this.hamburger = new Hamburger();
  }

  addBread(breadType) {
    this.hamburger.bread = breadType;
    return this;
  }

  addMeat(meatType) {
    this.hamburger.meat = meatType;
    return this;
  }

  addCheese(cheeseType) {
    this.hamburger.cheese = cheeseType;
    return this;
  }

  addLettuce() {
    this.hamburger.lettuce = 'レタス';
    return this;
  }

  build() {
    return this.hamburger;
  }
}
      

Step 3: Builderを使ってハンバーガーを作る

Builderクラスを使って、ハンバーガーを組み立てるよ。パンや肉、チーズ、レタスを順番に追加していって、最終的に完成したハンバーガーを表示しよう。


// ハンバーガーを組み立てる
const builder = new HamburgerBuilder();
const myHamburger = builder.addBread('ゴマ付きパン')
                           .addMeat('牛肉')
                           .addCheese('チェダーチーズ')
                           .addLettuce()
                           .build();

myHamburger.show(); // 結果: パン: ゴマ付きパン, 肉: 牛肉, チーズ: チェダーチーズ, レタス: レタス
      

Step 4: ハンバーガーのカスタマイズ

Builderパターンを使うと、ハンバーガーを簡単にカスタマイズできるんだ。例えば、チーズ無しのハンバーガーや、特別なパンを使ったハンバーガーを作ることもできるよ。


// チーズ無しハンバーガー
const cheeseLessHamburger = builder.addBread('ライ麦パン')
                                   .addMeat('鶏肉')
                                   .addLettuce()
                                   .build();

cheeseLessHamburger.show(); // 結果: パン: ライ麦パン, 肉: 鶏肉, チーズ: null, レタス: レタス
      

Builderパターンの重要なポイント

これでBuilderパターンの解説は終わりだ。
このパターンを使うと、複雑なオブジェクトを段階的に生成できるため、細かい設定が必要なオブジェクトに適している。