我只是想知道这是否是在 PHP 中创建对象和实现工厂模式的正确方法。我知道我们有工厂方法模式和抽象工厂模式,但是我们有像下面这样的模式吗http://noondreams.com/shared/data/pages/images/Factory.png 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
}
}
}
不,这并不是真正的工厂模式。工厂模式看起来更像是这样的:
<?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
{
}
请注意抽象类如何创建具体类的实例来扩展它,而用户不必担心它可能返回的各种类型。
Note:在实际场景中,您不会使用 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
{
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)