Сомнения относительно использования фабричной функции в Java - PullRequest
2 голосов
/ 17 октября 2011

Я только изучал java. Один из моих коллег сказал, что вызов класса напрямую не является хорошей идеей, он попросил меня использовать фабричный метод для его создания. У меня есть несколько вопросов по этому поводу:

  1. Зачем нам нужна фабричная функция вместо непосредственного создания класса?
  2. Какая от этого польза?
  3. будет ли это потреблять создание объекта?

Ответы [ 4 ]

1 голос
/ 17 октября 2011

Вы не обязаны это делать. Вы также можете создать фабричный класс. Взгляните на эту ссылку, чтобы понять, какова цель этого шаблона

0 голосов
/ 17 октября 2011

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

0 голосов
/ 17 октября 2011

Одна из причин, по которой я могу придумать, - избегать дублирования кода. У вас может быть одинаковый код создания экземпляра, чтобы избежать этого, вы можете использовать этот шаблон.

0 голосов
/ 17 октября 2011

Есть несколько причин, почему вы должны это сделать. Некоторые хорошие. Некоторые плохие. Начнем с плохой причины:

  • Потому что все так говорят. Ваш коллега действительно должен быть в состоянии объяснить, почему, и вы должны спросить его. Тогда суди его причины.

Лучшая причина: это действительно сводится к принципу единой ответственности (S SOLID )

Если у вас есть класс A, который создает экземпляр класса B и вызывает этот экземпляр, то это действительно сильный намек на то, что вы объединили две обязанности. (создать и позвонить или сформулировать это по-другому: решить, кто должен что-то делать, и позволить этому сделать).

Средство защиты от этого - создать экземпляр B вне A и поместить его в A. В зависимости от варианта использования у вас есть разные варианты

  • создайте B вне A и вставьте его в A через конструктор. Это правильный путь, если A нужен B в нескольких местах, и ему нужен ровно один.

  • создайте B вне A и вставьте его в A с помощью вызова некоторого метода. Это правильный путь, если A нуждается в B (s) для одного взаимодействия и нуждается / принимает другой в следующем взаимодействии.

  • передать фабрику в A, которую A может использовать для создания B по желанию. Это уместно, когда A требуется несколько Bs.

Таким образом, остается вопрос: почему так плохо использовать конструктор напрямую, а не фабрику, кроме нарушения какого-то утомительного правила, выдуманного действительно умным человеком? Если A создает Bs, вызывая конструктор для B, ему нужно знать все, что нужно B для выполнения своей работы, что может быть связано с большим количеством вещей и связано с необходимостью создания C, D и Es, которые сами имеют зависимости, которые необходимо создать. .. Я думаю, вы видите смысл.

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