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

どんなもの?

  • オブジェクト生成のためのインターフェースを定義する。インターフェースの実装クラスがどのクラスのオブジェクトを生成するかを決める。Factory Methodは、実装クラスに生成を延期するということ。
  • virtualコンストラクタを定義する

どんなときに使う?

(if-else文をユーザ側ではなくFactory側に持ってこれる)

典型的な構成要素

  • Product
  • ConcreteProduct
  • Factory
  • ConcreteFactory

コード

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

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

class ConcreteProductA: public Product{
public:
  ConcreteProductA(string name){
    productname = name;
  }
  void print(){
    cout << "this productA is " << productname << endl;
  }
private:
  string productname;
};

class ConcreteProductB: public Product{
public:
  ConcreteProductB(string name){
    productname = name;
  }
  void print(){
    cout << "this productB is " << productname << endl;
  }
private:
  string productname;  
};

class Factory{
public:
  Product* create(string type, string name){
    Product* p = createProduct(type, name);
    return p;
  }
private:
  virtual Product* createProduct(string type, string name) = 0;
};

class ConcreteFactory: public Factory{
public:
  Product* createProduct(string type, string name){
    if(type == "A"){
      return new ConcreteProductA(name);
    }else if(type =="B"){
      return new ConcreteProductB(name);
    }else{
      return NULL;
    }
  }
};