不,这不是真正的工厂模式。工厂模式看起来更像这样:
<?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
{
}