Abstract Factoryパターンの解説

Abstract Factoryパターンとは、関連するオブジェクト群をまとめて作成するためのインターフェースを提供するデザインパターンだ。これにより、複数の関連するオブジェクトを一括で生成し、依存関係を整えることができる。

たとえば、ファンタジーゲームで「エルフ」や「オーク」の種族ごとに武器や防具を生成するような場面で役立つ。

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

解説

たとえば、動物園があって、草食動物エリアや肉食動物エリアがあるとしよう。それぞれのエリアには「動物」と「餌」がセットで必要だよね。このパターンでは、草食動物エリア専用の工場と、肉食動物エリア専用の工場を作るイメージだ。

Step 1: 動物と餌のクラスを作る

まず、草食動物と肉食動物、それぞれの動物と餌のクラスを作るよ。それぞれに「動物を紹介する」メソッドと「餌を紹介する」メソッドを作ろう。


// 草食動物クラス
class Herbivore {
  describeAnimal() {
    console.log("草食動物です!");
  }
}

// 草食動物の餌クラス
class HerbivoreFood {
  describeFood() {
    console.log("草食動物のための野菜です!");
  }
}

// 肉食動物クラス
class Carnivore {
  describeAnimal() {
    console.log("肉食動物です!");
  }
}

// 肉食動物の餌クラス
class CarnivoreFood {
  describeFood() {
    console.log("肉食動物のための肉です!");
  }
}
      

Step 2: 草食動物エリア専用の工場を作る

次に、草食動物エリア専用の工場を作るよ。この工場では、草食動物とその餌を作ることができる。


// 草食動物エリア工場クラス
class HerbivoreFactory {
  createAnimal() {
    return new Herbivore();
  }
  
  createFood() {
    return new HerbivoreFood();
  }
}
      

Step 3: 肉食動物エリア専用の工場を作る

同じように、今度は肉食動物エリア専用の工場を作ろう。この工場では、肉食動物とその餌を作ることができる。


// 肉食動物エリア工場クラス
class CarnivoreFactory {
  createAnimal() {
    return new Carnivore();
  }
  
  createFood() {
    return new CarnivoreFood();
  }
}
      

Step 4: 工場で動物と餌を作る

最後に、工場を使って動物と餌を作ってみよう。草食動物エリアの工場では草食動物とその餌を、肉食動物エリアの工場では肉食動物とその餌を作ることができる。


// 草食動物エリアの工場で動物と餌を作る
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パターンの重要なポイント

これでAbstract Factoryパターンの解説は終わりだ。
このパターンを使うと、オブジェクトの生成に関わるコードを統一的に管理でき、異なるオブジェクト群をまとめて扱う際に便利だ。