我只是想知道这是否是在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
}
}
}
答案 0 :(得分: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
{
}