Мы должны реализовать фабрику, способную создавать несколько сложных объектов.
Как мы должны справиться с этим путем внедрения зависимости?
Я уже прочитал много тем об этом в stackoverflow (и в других местах), особенно те, что касаются Марка Симэнна, но не могу принять никакого решения, поэтому нужно ваше мнение.
Например:
<?php
class EventFactory
{
public function createEvent($type)
{
switch ($type) {
case 'upload':
return new UploadEvent(new FtpUploader(), new Mailer());
case 'download':
return new DownloadEvent(new FtpDownloader(), new Mailer());
case 'save':
return new SaveEvent(new EventDbModel());
case 'load':
return new LoadEvent(new EventDbModel());
case 'notify':
return new NotifyEvent(new HttpRequester());
}
}
}
Я нашел несколько решений, но не знаю, какое выбрать.
Проблемы: те же, что и при использовании инъекции зависимостей.
Проблемы: в конструкторах будет много параметров и список может увеличиться
Проблемы: Является ли роль построителя DP для обработки зависимостей? Я боюсь получить те же проблемы, что и решение № 1.
Что нам делать ?
Бен
Лично я бы выбрал вариант 2. Сборщики обычно используются, когда вы хотите настроить здание, но скрыть реализацию от клиента. Когда вам нужно только передать параметры, то фабрика обычно лучше.
Если вас беспокоит количество параметров, то вы можете либо передать объект параметра на фабрику, либо создать отдельные фабрики ответственности, каждая из которых знает тип создаваемой вещи и способ ее создания, а затем объединить их в цепочку ответственности, спрашивая каждого, может ли он создать запрошенный тип, и передавая его, если не может, или даже просто список
экземпляров «фабрики одного типа».
Таким образом, каждая «фабрика» имеет только необходимые ей зависимости, и цепочка просто организует доступные фабрики и поэтому нуждается только в зависимостях от них, ничего не зная о своих зависимостях.
Не использовать цепочку ответственности проще. Некоторое решение как это:
public class EventFactory
{
IEnumerable<ISingleTypeEventFactory> factories
public EventFactory(IEnumerable<ISingleTypeEventFactory> factories)
{
this.factories = factories;
}
public Event CreateEvent($type)
{
foreach(factory in factories)
{
if (factory.CanHandleType($type))
{
return factory.CreateEvent($type);
}
}
}
}
Других решений пока нет …