Builderパターンとは、複雑なオブジェクトの生成過程を簡単にするために、一つずつ段階を踏んで作成するデザインパターンだ。これにより、オブジェクトの作り方を柔軟に変更できる。
たとえば、ハンバーガーを作るとき、パン、肉、野菜などを組み合わせて好みのハンバーガーを作れるようにするのがこのパターンだ。
では、サンプルコードを一緒に見ていこう。
例えば、ハンバーガーを作る工場を考えてみよう。ハンバーガーにはパン、肉、レタス、チーズなどの材料があって、それらを組み立てる必要があるよね。Builderパターンでは、一つ一つの部品(材料)を組み立てながら、最終的に完成したハンバーガーを作るイメージだ。
まず、ハンバーガーの各パーツを持つ「ハンバーガー」クラスを作るよ。パンや肉、チーズ、レタスが入るかどうかを設定できるようにするんだ。
// ハンバーガーのクラス
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}`);
}
}
次に、ハンバーガーを組み立てるための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;
}
}
Builderクラスを使って、ハンバーガーを組み立てるよ。パンや肉、チーズ、レタスを順番に追加していって、最終的に完成したハンバーガーを表示しよう。
// ハンバーガーを組み立てる
const builder = new HamburgerBuilder();
const myHamburger = builder.addBread('ゴマ付きパン')
.addMeat('牛肉')
.addCheese('チェダーチーズ')
.addLettuce()
.build();
myHamburger.show(); // 結果: パン: ゴマ付きパン, 肉: 牛肉, チーズ: チェダーチーズ, レタス: レタス
Builderパターンを使うと、ハンバーガーを簡単にカスタマイズできるんだ。例えば、チーズ無しのハンバーガーや、特別なパンを使ったハンバーガーを作ることもできるよ。
// チーズ無しハンバーガー
const cheeseLessHamburger = builder.addBread('ライ麦パン')
.addMeat('鶏肉')
.addLettuce()
.build();
cheeseLessHamburger.show(); // 結果: パン: ライ麦パン, 肉: 鶏肉, チーズ: null, レタス: レタス
これでBuilderパターンの解説は終わりだ。
このパターンを使うと、複雑なオブジェクトを段階的に生成できるため、細かい設定が必要なオブジェクトに適している。