Мне просто интересно, правильно ли это создать объекты и внедрить фабричный шаблон в PHP. Я знаю, что у нас есть шаблон фабричного метода и шаблон абстрактной фабрики, но есть ли у нас шаблон, подобный следующему: http://img.ruphp.com/php/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 { }
Обратите внимание, как абстрактный класс создает экземпляры конкретных классов, которые расширяют его, без необходимости беспокоиться о различных типах, которые он может вернуть.
Примечание : в реальном сценарии вы не будете использовать оператор 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 { }