もはや知らずしらずのうちに使っていてもおかしくないほど多用されているファクトリーパターン。私もようやくソースコードの中でいきなりnew XXX
をすることに気持ち悪さを覚えてくるようになりましたが、まさに気持ち悪い理由の解決策がファクトリーパターンです。
気持ち悪い理由は明確で、ソースコードのあちこちでnew XXX
をするとXXX
内の設計が変わったときに、すべてのnew XXX
を調べだしていちいち変更しなくてはいけないからです。
そのためnew XXX
をする部分を1箇所(これがファクトリー、工場と呼ばれる所以ですが)にまとめたものがFactoryパターンです。
Automobile.php
class Automoblie
{
$vehicleMake;
$vehicleModel;
public function __construct($make, $model)
{
$this->vehicleMake = $make;
$this->vehicleModel = $model;
}
public getName()
{
return $vehicleMake . ' ' . $vehicleModel;
}
}
こんな自動車の設計書があったとします。この自動車を生成する工場をつくります。
AutomobileFactory.php
public static function create($make, $model)
{
return new Automobile($make, $model);
}
こんなかんじですね。new
が一箇所にまとまっているため、何か変更があった場合もFactoryに変更を加えればokです。
実際の呼び出しはこんなかんじ。
index.php
$automobile = AutomobileFactory::create('ブガッティ'、'ヴァイロン');
echo $automobile->getName(); // ブガッティ ヴァイロン
オブジェクト作成の初期化が煩雑になったときもFactoryパターンをつかっていると、一箇所にまとまるので楽、という特典もあります。