PHP でデザインパターン (Factory Method)
PHP デザインパターン
Published: 2018-09-25

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();

参考