Я практиковал внедрение зависимостей конструктора во всем своем PHP-приложении. Я не хотел засорять свой код созданием объектов, поэтому фабрики пришли на помощь, или, по крайней мере, я так думал.
Я начал связывать компоненты с фабриками, затем некоторые фабрики начали использовать другие фабрики для получения зависимостей, отлично, весь код создания хранится в одном месте. Однако, как только фабрики начинают использовать друг друга (или, как в приведенном ниже коде, сами по себе), я столкнулся с проблемами циклической зависимости, которые просто не могут быть решены. Например, моя MapperFactory использует себя для внедрения картографов с другими картографами (они нужны друг другу для построения полного графа объектов «нетерпеливой загрузки»):
class MapperFactory
{
public function create($type)
{
switch (true) {
case 'Item':
$mapper = new ItemMapper(
$this->create('Field')
);
break;
case 'Field':
$mapper = new ItemMapper(
$this->create('Item')
);
break;
default:
throw new Exception('Unknown mapper');
}
return $mapper;
}
}
$mf = new MapperFactory();
$mf->create('Item');
Это упрощенный пример, но проблема становится все более распространенной по мере разработки приложения. Ошибка возврата из PHP (установлен xdebug):
Fatal error: Maximum function nesting level of '100' reached, aborting!
Полностью понимаю, почему PHP жалуется (хотя не ожидал, что это произойдет, TBH).
Мой вопрос в том, я полностью упустил смысл фабрик? правильно ли я использую фабрики? Казалось бы, нет, но кроме циклической зависимости (довольно серьезной, но), фабрики — это элегантное решение для сокрытия всей логики построения/проводки от основного приложения.
switch (true) ...
это не то, что вы хотели написать. Но даже сswitch ($type)
вы получите бесконечный цикл, если$type
равноField
илиItem
. - person Yoshi   schedule 13.08.2012