Factory Method の目的
インスタンスを生成する工場を Template Method パターンで構成したもの
Factory Methodパターンを利用することで、オブジェクトの利用側はどのインスタンスが生成されるのかを知る必要がなくなります。
Factory Method パターンのメリット
- オブジェクトの生成処理と使用処理を分離できる
- オブジェクトの利用側とオブジェクトのクラスの結びつきを低くする
実装例
<?php
interface Reader
{
public function read();
public function display();
}
class CSVFileReader implements Reader
{
private $filename;
public function __construct($filename)
{
$this->filename = $filename;
}
public function read()
{
echo "CSVファイルの読み込み\n";
}
public function display()
{
echo "CSVの各行を表示\n";
}
}
class XMLFileReader implements Reader
{
private $filename;
public function __construct($filename)
{
$this->filename = $filename;
}
public function read()
{
echo "XMLファイルの読み込み\n";
}
public function display()
{
echo "XMLの各行を表示\n";
}
}
class ReaderFactory
{
public function create($filename)
{
$reader = $this->createReader($filename);
return $reader;
}
private function createReader($filename)
{
if (preg_match('/.+\.csv$/', $filename)) {
return new CSVFileReader($filename);
} elseif (preg_match('/.+\.xml$/', $filename)) {
return new XMLFileReader($filename);
}
throw new Exception('サポートしていない');
}
}
// 呼び出し元
$filename = 'abc.xml';
$factory = new ReaderFactory();
$data = $factory->create($filename);
$data->read();
$data->display();