Factory Method パターン

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

そろそろ今までと違って複雑になってきてる予感。

Factory Method パターンは、他のクラスのコンストラクタをサブクラスで上書き可能な自分のメソッドに置き換えることで、 アプリケーションに特化したオブジェクトの生成をサブクラスに追い出し、クラスの再利用性を高めることを目的とする。

クラス図

Factory Method PlantUML

実装としては説明「framework」からなるべく「idcard」側のパッケージに関与しない形を作り出したいと言った所だろうか、PHP では package の概念がなさそうなので、せめてのもの区分として名前空間で実装をしている。

自分としての理解・疑問

  • あえて日本語で書くとする場合、共有化したい処理は「framework」側でまとめて「idcard」側では固有な処理が集中できるような形にすれば良いという考え方だと思う。
  • ここでは IDCardFactory が生成するインスタンスの種類が 1 つだけだがさらに違う物が追加された時に真価が発揮させるのだろう。たとえば「MembardCard」を別に実装しなければならないとか。
  • インスタンスを生成する「create」は framework 側が担っているが実装は idcard 側の createProduct 側に任されている。
  • 「framework」側に「idcard」の記載を一切なくしている所がポイントで、ここが判断基準になるのかも。
<?php
namespace framework;
require_once "Product.php";
use framework\Product as Product;

abstract class Factory
{
    final public function create(string $owner)
    {
        $p = $this->createProduct($owner);
        $this->registerProduct($p);
        return $p;
    }
    abstract protected function createProduct(string $owner);
    abstract protected function registerProduct(Product $product);
}

参考