Весь смысл фабрики заключается в том, чтобы конфигурировать способ создания экземпляров реализации для интерфейсов.Соглашение о том, чтобы фабрика в том же пакете, что и классы реализации, которые она предоставляет, добавляет полностью ненужное ограничение, которое вряд ли встретит в будущем.. Также , если возвращенная реализация не является одинаковой во всех контекстах, это делает еще меньше смысла иметь ее в одном пакете.
Например, представьте сервис поиска завод, который разделяется между клиентом и серверной части приложения, которая возвращает реализацию на стороне клиента (который проживает в клиент-только пакет) на клиенте, и серверная реализация (в серверном пакете) при вызове из среды выполнения сервера.
Возможно, ваш завод может быть сконфигурирован (мы делаем это с помощью XML-файла, который определяет, какой класс реализации следует возвращать для какого интерфейса), поэтому классы реализации могут быть легко переключены или различные сопоставления могут использоваться для разных контекстов. Например, при модульном тестировании мы используем конфигурацию, которая возвращает реализацию макетов для интерфейсов (не удастся выполнить модульные тесты, которые не являются интеграционными тестами), и совершенно не имеет смысла требовать реализации макетов быть в том же пакете, что и на заводе, поскольку они являются частью кода тестирования, а не кода времени выполнения.
Моя рекомендация:
- Не добавлять каких-либо ограничений на пакет классов implmentation, как вы не знаете, какие варианты реализации используются в будущем, или в различных контекстах .
- Интерфейсы могут быть в той же упаковке , но это ограничение также является ненужным и только делает конфигурацию жесткой.
- Конфигурируемые фабрики (например, службы поиска) могут быть использованы повторно и общими для всех проектов, когда отображение интерфейса/реализации не жестко. Только эта точка оправдывает наличие фабрики , отделенной от обоих интерфейсов и классов реализации.
Чтобы разработать, используя видимость пакета *, я думаю, вы имеете в виду, что конкретные типы экземпляров, созданных заводом-изготовителем, могут быть областями с пакетом, а не публично видимыми, - и тогда завод является единственным публичным означает создание типов, соответствующих некоторому интерфейсу. Даже более жесткое блокирование происходит путем определения типов, созданных фабрикой, в виде абстрактных классов с конструкторами * package-private *; тогда подклассы могут быть определены только внутри содержащего пакета. http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html – seh
Согласен. На мой взгляд, размещение фабрик в специализированном «заводском пакете» будет даже ошибочным, так как организация пакета должна определяться концепциями доменов (я поклонник DDD :-)). – theDmi