« …えっ!? | トップページ | FlyWeight »

Abstruct Factory

はい、今日は先生がAbstruct Factoryについて解説するぞー。

簡単に言います。「アブストラクトファクトリ」は「ファクトリ」を切り替え可能にするためのパターンです。

…言っちゃった。

ファクトリはわかりますよね?わかんねぇ?例えば、C++で適当に書くなら

class IBase
{
public:
  virutal void tekitou()=0;
};

class Derive1 : public IBase
{
public:
  virutal void tekitou()
  {
   cout << "A";
  }
};

class Derive2 : public IBase
{
public:
  virutal void tekitou()
  {
   cout << "B";
  }
};

とかやって、

class Factory
{
public:
  IBase* create(int param)
  {
   if(param){
    return new Derive1();
   }
   else{
    return new Derive2();
   }
  }
};

で、

Factory f;
IBase* b = f.create(0);
b.tekitou();
IBase* c = f.create(1);
c.tekitou();

てな感じ。どっちもIBase型なのに、振舞いがかわるんだねぇ。むむっ、仕事が忙しくて少しだけボクサーにあるまじきお腹になっている!!ちょっと腹筋200回します。

…ハァハァ、プログラマとボクサーの両立は大変ですたい。

あ、まだAbstruct Factoryじゃないですよ。ここまでは通常のC++のテクニック、Factory Methodではあるけれど、まぁわざわざパターンって呼ぶまでもないのねん。で、ここからがAbstruct Factory

その名の通り、ファクトリクラスをAbstructにします。つまり

class IFactory
{
public:
  vitrual IBase* create(int param)=0;
};

class IFactory
{
public:
  vitrual IBase* create(int param)=0;
};

class Factory1 : public IFactory
{
public:
  vitrual IBase* create(int param)
  {
   if(param){
    return new Derive1();
   }
   else{
    return new Derive2();
   }
  }
};

class Factory2 : public IFactory
{
public:
  vitrual IBase* create(int param)
  {
   if(param){
    return new Derive3();
   }
   else{
    return new Derive4();
   }
  }
};

と、なります。で、これを例えばシステムに組み込むとすれば

class System
{
private:
  IFactory* m_factory;
public:
  void SetWindowFactory(IFactory* factory){
   m_factory = factory;
  }
  void createWindow(int param){
   m_factory.create(param);
  }
};

System s;
s.SetWindowFactory(new Factory2);
s.createWindow(1);

てな使い方ができる。つまりファクトリ自体の振舞いが変わるってわけ。そんなことして何の利点があるん?というとですな。まぁ、場面によって生成されるものの性質を大きく変えたいとか、マルチプラットフォーム時のためとか、アロケータだのローダーの生成方法を変えたいときに使用する。

ここでの例のように生成されるウィンドウの種別を変えてもいいけどね(GOF本の解説ではそういう用途だった)。

|

« …えっ!? | トップページ | FlyWeight »

デザインパターン」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/165749/41649932

この記事へのトラックバック一覧です: Abstruct Factory:

« …えっ!? | トップページ | FlyWeight »