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 回答