4

オブジェクトを作成し、PHP でファクトリ パターンを実装するには、これが正しい方法なのだろうかと思います。ファクトリ メソッド パターンと抽象ファクトリ パターンがあることは知っていますが、次のようなパターンはあります かhttp://noondreams.com/shared/data/pages/images/Factory.png ?

class Factory
{
 public function make($format)
 {
    switch($format)
    {
        case Source::Assocs:
            return new \Source\Formats\Assocs();
        case Source::XML
            return new \Source\Formats\XML();
        //Some other formats
    }
 }
}
4

1 に答える 1

6

いいえ、これは工場出荷時のパターンではありません。ファクトリ パターンは次のようになります。

<?php
abstract class File
{
    public static function createFromFile($filename)
    {
        $extension = /* get file extension */;

        switch ($extension)
        {
            case 'xml':
                return new XmlFile($filename);
                break;
            case 'php':
                return new PhpFile($filename);
                break;
        }

        throw new \InvalidArgumentException();
    }
}

class XmlFile extends File
{

}

class PhpFile extends File
{

}

抽象クラスが具象クラスのインスタンスを作成し、それを拡張する方法に注意してください。ユーザーは、それが返す可能性のあるさまざまな型について心配する必要はありません。

: 実際のシナリオでは、switch ステートメントは使用しませんが、抽象クラスはすべての子クラスを認識していないため、リフレクションやその他のさまざまな手法を使用する可能性があります。

それは次のようになります。

<?php
abstract class File
{
    public static function createFromFile($filename)
    {
        $extension = /* get file extension */;
        $extension = ucfirst($extension);

        $reflection = new ReflectionClass($extension . 'File');
        return $reflection->newInstanceArgs(array($filename));
    }
}

class XmlFile extends File
{

}

class PhpFile extends File
{

}
于 2013-02-08T21:26:53.393 に答える