Factory Methodパターンとは、インスタンスの生成をサブクラスに任せることで、オブジェクト生成の仕組みを柔軟に変更できるデザインパターンだ。これにより、どの具体的なクラスのインスタンスを作るかを動的に決めることができる。
たとえば、敵キャラクターをランダムに生成するゲームで、敵の種類を状況によって変えたい場合、このパターンが使える。
では、サンプルコードを一緒に見ていこう。
例えば、おもちゃ工場を考えてみよう。この工場では、クマのぬいぐるみやロボットなど、さまざまなおもちゃを作っている。Factory Methodパターンを使えば、「どんなおもちゃを作るか」というロジックを工場に任せることができるんだ。
まず、クマのぬいぐるみとロボットのおもちゃのクラスを作るよ。それぞれに「遊ぶ」ためのメソッドを用意しよう。
// クマのぬいぐるみクラス
class TeddyBear {
play() {
console.log("クマのぬいぐるみで遊んでいます!");
}
}
// ロボットクラス
class Robot {
play() {
console.log("ロボットで遊んでいます!");
}
}
次に、おもちゃを作る工場クラスを作ろう。この工場では、必要なおもちゃを簡単に作ることができる。例えば、「クマ」を注文すると、クマのぬいぐるみを作り、「ロボット」を注文すると、ロボットのおもちゃを作る。
// おもちゃ工場クラス
class ToyFactory {
createToy(toyType) {
if (toyType === "teddy") {
return new TeddyBear();
} else if (toyType === "robot") {
return new Robot();
} else {
console.log("そのおもちゃは作れません");
return null;
}
}
}
次に、ToyFactoryクラスを使って実際におもちゃを作り、それで遊んでみよう。工場に「teddy」を注文すればクマが作られ、「robot」を注文すればロボットが作られる。
// 工場でおもちゃを作る
const factory = new ToyFactory();
const teddy = factory.createToy("teddy");
teddy.play(); // 結果: クマのぬいぐるみで遊んでいます!
const robot = factory.createToy("robot");
robot.play(); // 結果: ロボットで遊んでいます!
工場に存在しないおもちゃを注文した場合、どうなるか見てみよう。工場は対応していないおもちゃを作ろうとすると、「そのおもちゃは作れません」とメッセージが表示される。
// 無効なおもちゃを注文
const unknownToy = factory.createToy("car"); // 結果: そのおもちゃは作れません
これでFactory Methodパターンの解説は終わりだ。
このパターンを使うと、具体的なインスタンス生成の細かい部分を隠し、柔軟な拡張が可能になるので、新しいクラスを追加しやすくなる。