Abstract Factory パターン

デザインパターンちゃんと勉強をしようと思ったので結城さんの本を 1 つ 1 つ実装してみる。 前回の Builderからの続き。

関連するインスタンス群を生成するための API を集約することによって、複数のモジュール群の再利用を効率化することを目的とする。日本語では「抽象的な工場」と翻訳される事が多い。

かなり大掛かりになっているので namespace で分ける形にしている。元々の java の実装では package が使われているが、PHP では同様の仕組みがないので namespace で代用してる。

クラス図

Abstract Factory PlantUML

自分としての理解・疑問

  • 大掛かりではあるが、写経しているとそれほど複雑性は感じない。
  • 抽象的な部分と具体的な部分を明確に分け実装すると「次の工場」の実装がかなり楽になりそう。
  • 具体的な部分を切り出す(工場化)する事でテストもしやすいと感じる。

抽象的なグループである factory(namespace)から工場のインスタンスが作られる所をポイントだと感じるので、共通している処理を見通せるようなものなら役にたちそう。

<?php
/**
 * 工場作成
 *
 * @access public
 * @static
 * @param string $classname 工場名(クラス名)
 * @return object $this->factory
 */
public static function getFactory($classname)
{
    $factory = null;
    try {
        $factory = new $classname;
    } catch (Exception $e) {
        echo "捕捉した例外:" . $e->getMessage() . "\n";
    }
    return $factory;
}

参考