デザインパターンを覚えたい (Abstract Factory)

Abstract Factoryパターン

決められた部品や製品を作成する抽象的な工場のパターン。作成を担当するFactoryクラス、そのFactoryで生成されるProductクラス群から構成される。
実装では外部に公開するメソッドを定義した「抽象的な工場と製品」を用意し、外部プログラムはその抽象的な定義を経由して具象クラスのメソッドにアクセスする。
Abstract Factoryのメリットは

  1. 抽象クラスを介してアクセスするため、使う側の実装とFactory内の実装の依存関係を切り離せる
  2. 協調しあうクラス群の生成を同一のFactory内に集約できる

とかかなぁ。ただし、Abstract Factoryは新しい工場を増やすのは得意だけど、部品を追加するのは苦手みたい。

とりあえず実装。C++でやってみる。参考書だとリフレクション使ってConcreteFactory名を直接指定してるけど、C++でやるのでもっと簡略化して実装する。
あと、せっかくなのでSingletonを使う。
http://dl.dropbox.com/u/7810000/code/design_pattern/abstract_factory.zip

実行結果は以下の通り。

$ ./abstract_factory_test
### get HogeFactory ###
call HogeProductA::execute
call HogeProductB::execute
call HogeProductC::execute
### get FugaFactory ###
call FugaProductA::execute
call FugaProductB::execute
call FugaProductC::execute

ポイントはmainでFactoryを使ってるところですかね。

void executeProducts( const std::string name ) {
    Factory* factory = getFactory(name);
    if (factory == NULL) return;

    ProductA* productA = factory->createProductA();
    productA->execute();
    delete productA;

    ProductB* productB = factory->createProductB();
    productB->execute();
    delete productB;

    ProductC* productC = factory->createProductC();
    productC->execute();
    delete productC;
}

実装では2つのFactoryの具象クラスがでてくるけども、使う側はそれを特に意識する必要はない。
# まあ、はじめにインスタンス取ってくるところは仕方がないけど

ところで、以前似たようなものでFactoryMethodパターンがあったけども、AbstractFactoryとの違いがいまいちピンときてない。
FactoryMethodはクラス生成をサブクラスに委譲することがメインで、AbstractFactoryは関連クラスをまとめることがメインなのかなぁ。
なんか、AbstractFactoryFactoryMethodを暗黙的に使ってるようにも感じる。

うーむ、GoF本の原著読むとわかるのかな。