【デザインパターン】Abstract Factory

どんなもの?

  • 関連するオブジェクトをConcreteクラスを意識せずに、まとめて生成するインターフェースを提供する

どういうときに使う?

  • 整合性を必要とする一連のオブジェクト群を、間違いなく生成したいとき

典型的な構成要素

  • AbstractFactory
  • ConcreteFactory
  • Product1
  • Product2
  • ConcreteProduct1
  • ConcreteProduct2
  • Client

コード

#include <iostream>
#include <string>
using namespace std;

//#define JAPAN
#define AMERICA

class Product{
public:
  virtual void print() = 0;
};

class Tokyo: public Product{
private:
  void print(){
    cout << "Capital is Tokyo" << endl;
  }
};

class Washington: public Product{
private:
  void print(){
    cout << "Capital is Washington" << endl;
  }
};

class Sushi: public Product{
private:
  void print(){
    cout << "Sushi is famous" << endl;
  }
};

class Steak: public Product{
private:
  void print(){
    cout << "Steak is famous" << endl;
  }
};

class Factory{
public:
  virtual Product* createCapitalInstance() = 0;
  virtual Product* createFoodInstance() = 0;
};

class JapanFactory: public Factory{
public:
  Product* createCapitalInstance(){
    return new Tokyo;
  }
  Product* createFoodInstance(){
    return new Sushi;
  }
};

class AmericaFactory: public Factory{
public:
  Product* createCapitalInstance(){
    return new Washington;
  }
  Product* createFoodInstance(){
    return new Steak;
  }
};

int main(){
#ifdef JAPAN
  // Factoryの生成
  Factory *factory = new JapanFactory();
#else
  Factory *factory = new AmericaFactory();
#endif

  Product* capital = factory->createCapitalInstance();
  Product* food = factory->createFoodInstance();
  
  // 生成したのメソッド呼び出し
  capital->print();
  food->print();
  return 0;
}