Фабричный класс, совершающий дБ / сервисные звонки - PullRequest
1 голос
/ 16 июля 2011

Мне нужно провести рефакторинг нескольких длинных методов.

В нашем приложении мы создаем серию документов одного типа с разными значениями, полученными из значений в приложении. Весь этот код теперь находится во вспомогательном классе, однако я хочу использовать фабричный класс для создания документов. Фабрика должна вести себя так, что если A, то вызвать factory.getDocument("A"), если B, то вызвать factory.getDocument("B").

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

Допустимо ли делать вызовы service / db в моем заводском классе?

Если нет, то должен ли я передавать аргументы для значений, которые мне нужны для построения объекта (например, factory.getDocument(a,b,c,d) или inputobject)? Похоже, это лишает смысла иметь фабричный класс, потому что вызывающей стороне потребуется информация о том, как сделать документ A, поэтому я предпочел бы избежать такого подхода. Я хочу, чтобы вызывающий метод ничего не знал о том, как создается документ.

Какие у меня варианты?

Ответы [ 4 ]

1 голос
/ 16 июля 2011

Я не вижу проблем с доступом к базе данных с завода.Цель фабрики состоит в том, чтобы производить объекты на основе некоторого ввода.Так что, если ввод поступает из базы данных?

1 голос
/ 16 июля 2011

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

В идеале класс Factory отвечает только за создание экземпляра правильного объекта на основе некоторого типа пользовательского ввода.В вашем примере я бы сказал, что используйте класс Factory только в том случае, если у вас есть различные типы реализаций класса Document.Заполняющий класс Document должен обрабатываться отдельным объектом (который может быть одноэлементным, если требуется).

0 голосов
/ 06 апреля 2013

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

0 голосов
/ 16 июля 2011

Хорошо, вопрос был отредактирован, поэтому я изменю ответ.

Что-то в вашем коде должно знать, что подразумевается под документом "A" и "B", если вы хотите, чтобы вызывающая сторона не зналапараметры для их создания.Нет причины, по которой эта логика не может содержаться на вашем заводе, или, по крайней мере, фабрика несет ответственность за поиск способов создания «A» и «B», что кажется очень разумным для заводского шаблона.

Это все еще тот случай, когда я бы поставил доступ к БД через синглтон, даже если это просто для получения соединения.См .: Java Singleton Pattern

...