Абстрактные фабрики используют «новый»? - PullRequest
8 голосов
/ 02 февраля 2012

Я пытаюсь использовать Dependency Injection как можно чаще, но у меня возникают проблемы, когда речь идет о таких вещах, как краткосрочные зависимости.

Например, допустим, у меня есть объект менеджера блога, который бынравится генерировать список блогов, которые он нашел в базе данных.Варианты сделать это (насколько я могу судить):

  1. new Blog ();
  2. $ this-> loader-> blog ();
    • объект загрузчика создает различные другие типы объектов, такие как объекты базы данных, текстовые фильтры и т. Д.
  3. $ this-> blogEntryFactory-> create ();

Однако # 1 плох, потому что он создает сильную связь.# 2 по-прежнему кажется плохим, потому что это означает, что фабрика объектов должна быть предварительно введена - выставляя все другие объекты, которые она может создать.

Номер 3 кажется нормальным, но если я использую # 3, я помещу«новые» ключевые слова в самом blogEntryFactory, ИЛИ, вставить ли загрузчик в blogEntryFactory и использовать загрузчик?

Если у меня много разных фабрик, таких как blogEntryFactory (например, у меня могут быть userFactory и commentFactory), это будетпохоже, что добавление ключевого слова "new" на все эти разные фабрики создаст проблемы с зависимостями.

Надеюсь, это имеет смысл ...

NOTE

У меня есть несколько ответов о том, как это не нужно для этого конкретного примера блога, но на самом деле бывают случаи, когда вам следует использовать шаблон Abstract Factory, и именно к этому я и подхожу.Вы используете «новый» в этом случае или делаете что-то еще?

Ответы [ 2 ]

4 голосов
/ 03 февраля 2012

Я не эксперт, но я собираюсь разобраться с этим. Это предполагает, что Blog - это просто объект модели данных, который действует как контейнер для некоторых данных и заполняется контроллером (new Blog не очень значим). В этом случае Blog является листом графа объекта, и использование new нормально. Если вы собираетесь тестировать методы, которым нужно создать Blog, вам все равно придется одновременно тестировать создание Blog, и использование фиктивного объекта не имеет смысла. Blog не сохраняется в прошлом этот метод.

В качестве примера, скажем, что PHP не имел конструкции массива, но имел объект коллекций. Вы бы позвонили $this->collectionsFactory->create() или с удовольствием сказали бы new Array;?

0 голосов
/ 02 ноября 2018

В ответ на заголовок: да, абстрактные фабрики обычно используют new. Например, см. Код MazeFactory на странице 92 книги GoF. Включает в себя return new Maze; return new Wall; return new Room; return new Door;

В ответ на примечание: проект, использующий абстрактные фабрики для создания моделей данных, весьма подозрительный. Цель состоит в том, чтобы изменить поведение продуктов фабрики, делая их конкретные реализации невидимыми для клиентов. Модели данных без поведения не получают выгоды от абстрактной фабрики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...