2009-12-12 4 views
10

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

Спасибо за ваше время и обратная связь

ответ

18

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

+3

Чтобы разработать, используя видимость пакета *, я думаю, вы имеете в виду, что конкретные типы экземпляров, созданных заводом-изготовителем, могут быть областями с пакетом, а не публично видимыми, - и тогда завод является единственным публичным означает создание типов, соответствующих некоторому интерфейсу. Даже более жесткое блокирование происходит путем определения типов, созданных фабрикой, в виде абстрактных классов с конструкторами * package-private *; тогда подклассы могут быть определены только внутри содержащего пакета. http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html – seh

+0

Согласен. На мой взгляд, размещение фабрик в специализированном «заводском пакете» будет даже ошибочным, так как организация пакета должна определяться концепциями доменов (я поклонник DDD :-)). – theDmi

0

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

Например действие завод может быть структурирована следующим образом:

  • пакет org.program.actions
  • интерфейс org.program.actions.Action
  • перечисление org.program.actions.ActionTypes
  • завод org.program.actions.ActionFactory (или .ActionManager)
  • действий по реализации классов org.program.actions.LogAction и т.д. .

Следующие шаблоны, подобные этим во всех проектах, помогают членам проекта находить классы, где они фактически находятся в проектах, в которых они раньше не участвовали.

0

Это полностью зависит от того, как вы собираетесь использовать указанные заводы. Иногда имеет смысл поставить завод в свой собственный пакет.

Возможно, у вас есть интерфейс, foo.bar.ui.Interface. Вы хотите иметь разные реализации этого интерфейса: один для AWT, один для Swing, один для консоли и т. Д. Тогда было бы более целесообразно создать foo.bar.ui.swing.SwingInterfaceFactory, который создает foo.bar.ui.swing.SwingInterface. Затем завод для foo.bar.ui.awt.AWTInterface будет находиться в foo.bar.ui.awt.AWTInterfaceFactory.

Пункт, это правило всегда соблюдается. Используйте все, что подходит для вашей проблемы.

+0

Не могу согласиться. Я не вижу, насколько кросс-пакетные зависимости являются хорошей идеей. Также не вижу смысла в создании пакета, который будет иметь один класс. Другое дело - не будет ли точка такой фабрики скрывать Свинг и AWT от вызывающего? Я бы подумал, что у вас будет единственная фабричная и конкретная реализация AWT и Swing foo.bar.ui.Interface. Кроме того, «Release/Reuse» на самом деле является общепринятым принципом «всегда следовать».Я уверен, что кто-то может подумать об исключении (я не могу отказаться от него), но, насколько общие принципы идут, этот довольно солидный. –

3

unit of reuse is the unit of release. Это означает, что не должно быть связи между пакетами, поскольку упаковка, как правило, является самой низкой степенью детализации выпуска. Когда вы организуете пакет, представьте себе, что вы говорите: «вот все, что вам нужно, чтобы использовать эти классы».

0

Почему бы и нет. сделайте его как можно ближе, если нет других возражений. фактически почему нет

public interface Toy 
{ 
    static class Factory 
    { 
     public static final Toy make() { ... } 
    } 
} 

Toy toy = Toy.Factory.make(); 

HA!

но make() не должен статически зависеть от подклассов Toy, это было бы плохо. он может сделать некоторую динамическую магию, зависит от вашей заводской стратегии.

4

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

Например, представьте сервис поиска завод, который разделяется между клиентом и серверной части приложения, которая возвращает реализацию на стороне клиента (который проживает в клиент-только пакет) на клиенте, и серверная реализация (в серверном пакете) при вызове из среды выполнения сервера.

Возможно, ваш завод может быть сконфигурирован (мы делаем это с помощью XML-файла, который определяет, какой класс реализации следует возвращать для какого интерфейса), поэтому классы реализации могут быть легко переключены или различные сопоставления могут использоваться для разных контекстов. Например, при модульном тестировании мы используем конфигурацию, которая возвращает реализацию макетов для интерфейсов (не удастся выполнить модульные тесты, которые не являются интеграционными тестами), и совершенно не имеет смысла требовать реализации макетов быть в том же пакете, что и на заводе, поскольку они являются частью кода тестирования, а не кода времени выполнения.

Моя рекомендация:

  • Не добавлять каких-либо ограничений на пакет классов implmentation, как вы не знаете, какие варианты реализации используются в будущем, или в различных контекстах .
  • Интерфейсы могут быть в той же упаковке , но это ограничение также является ненужным и только делает конфигурацию жесткой.
  • Конфигурируемые фабрики (например, службы поиска) могут быть использованы повторно и общими для всех проектов, когда отображение интерфейса/реализации не жестко. Только эта точка оправдывает наличие фабрики , отделенной от обоих интерфейсов и классов реализации.
+0

Я согласен с вашими пунктами здесь, но это не значит, что вы должны упаковать фабрику в другое место, кроме классов реализации. Могут быть случаи, когда все классы реализации находятся в одном пакете и всегда будут. Я думаю, что обе ситуации разумны. Зависит от приложения. –

+0

Да, очень часто классы реализации останутся неизменными для всего жизненного цикла проекта, и обычно на заводе будет один класс реализации для каждого интерфейса. Но, тем не менее, точка фабрики должна держать ее открытой и позволять обмену классами реализации в будущем. Добавление ограничений на упаковку фабрики нарушит его намерение и затруднит рефакторинг (путем обмена реализацией) в будущем. Даже для проектов, где вы уверены, что классы реализации никогда не обмениваются, лучше оставить эту точку открытой. –

Смежные вопросы