实施工厂模式的正确方法是什么?

时间:2013-02-08 21:17:38

标签: php design-patterns factory

我只是想知道这是否是在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
    }
 }
}

1 个答案:

答案 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
{

}