いいえ、これは工場出荷時のパターンではありません。ファクトリ パターンは次のようになります。
<?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
{
}