Abstract Factoryパターンとは、関連するオブジェクト群をまとめて作成するためのインターフェースを提供するデザインパターンだ。これにより、複数の関連するオブジェクトを一括で生成し、依存関係を整えることができる。
たとえば、ファンタジーゲームで「エルフ」や「オーク」の種族ごとに武器や防具を生成するような場面で役立つ。
では、サンプルコードを一緒に見ていこう。
たとえば、動物園があって、草食動物エリアや肉食動物エリアがあるとしよう。それぞれのエリアには「動物」と「餌」がセットで必要だよね。このパターンでは、草食動物エリア専用の工場と、肉食動物エリア専用の工場を作るイメージだ。
まず、草食動物と肉食動物、それぞれの動物と餌のクラスを作るよ。それぞれに「動物を紹介する」メソッドと「餌を紹介する」メソッドを作ろう。
// 草食動物クラス
class Herbivore {
describeAnimal() {
console.log("草食動物です!");
}
}
// 草食動物の餌クラス
class HerbivoreFood {
describeFood() {
console.log("草食動物のための野菜です!");
}
}
// 肉食動物クラス
class Carnivore {
describeAnimal() {
console.log("肉食動物です!");
}
}
// 肉食動物の餌クラス
class CarnivoreFood {
describeFood() {
console.log("肉食動物のための肉です!");
}
}
次に、草食動物エリア専用の工場を作るよ。この工場では、草食動物とその餌を作ることができる。
// 草食動物エリア工場クラス
class HerbivoreFactory {
createAnimal() {
return new Herbivore();
}
createFood() {
return new HerbivoreFood();
}
}
同じように、今度は肉食動物エリア専用の工場を作ろう。この工場では、肉食動物とその餌を作ることができる。
// 肉食動物エリア工場クラス
class CarnivoreFactory {
createAnimal() {
return new Carnivore();
}
createFood() {
return new CarnivoreFood();
}
}
最後に、工場を使って動物と餌を作ってみよう。草食動物エリアの工場では草食動物とその餌を、肉食動物エリアの工場では肉食動物とその餌を作ることができる。
// 草食動物エリアの工場で動物と餌を作る
const herbivoreFactory = new HerbivoreFactory();
const herbivore = herbivoreFactory.createAnimal();
const herbivoreFood = herbivoreFactory.createFood();
herbivore.describeAnimal(); // 結果: 草食動物です!
herbivoreFood.describeFood(); // 結果: 草食動物のための野菜です!
// 肉食動物エリアの工場で動物と餌を作る
const carnivoreFactory = new CarnivoreFactory();
const carnivore = carnivoreFactory.createAnimal();
const carnivoreFood = carnivoreFactory.createFood();
carnivore.describeAnimal(); // 結果: 肉食動物です!
carnivoreFood.describeFood(); // 結果: 肉食動物のための肉です!
これでAbstract Factoryパターンの解説は終わりだ。
このパターンを使うと、オブジェクトの生成に関わるコードを統一的に管理でき、異なるオブジェクト群をまとめて扱う際に便利だ。