Обработка зависимостей с помощью фабричного метода DP

Мы должны реализовать фабрику, способную создавать несколько сложных объектов.
Как мы должны справиться с этим путем внедрения зависимости?

Я уже прочитал много тем об этом в 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());
}
}
}

Я нашел несколько решений, но не знаю, какое выбрать.

  1. Решение было бы, как в примере, дать фабрике ответственность за создание экземпляров зависимостей.

Проблемы: те же, что и при использовании инъекции зависимостей.

  1. Другой способ — дать зависимости конструктору фабрики.

Проблемы: в конструкторах будет много параметров и список может увеличиться

  1. Третье решение, которое я также нашел в Интернете, — это создание каких-то строителей вместо событий. Фабрика несет ответственность за то, чтобы знать, какой тип объекта создать, а строители будут знать, как его создать.

Проблемы: Является ли роль построителя DP для обработки зависимостей? Я боюсь получить те же проблемы, что и решение № 1.

Что нам делать ?

Бен

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);
}
}
}
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]