Фабричный класс против Spring DI - PullRequest
4 голосов
/ 28 августа 2011

Согласно моему пониманию, и класс Factory, и Spring DI следуют за внедрением зависимости.Я имею в виду, что в обоих случаях внешняя сущность используется для продвижения зависимости. Правильно? Мой вопрос, какой из них я должен выбрать между фабричными классами и Spring DI, когда я собираюсь просто получить объекты.Предположим, я не хочу никаких других функций, таких как aop, dao support и т. Д. Единственная цель - получить объекты либо из класса Factory, либо из Spring DI.Какой из них предпочтительнее.

на каком-то сайте прочитайте это утверждение

DI слабо связано и менее навязчиво по сравнению с классами фабрики

Но не смог понять, как пружинный DIслабо связанные и менее навязчивые, чем фабричные классы? в обоих случаях мы должны вставить какой-то объектный код get в нашу базовую программу.

Ответы [ 2 ]

3 голосов
/ 28 августа 2011

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

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

Обычно Spring используется для настройки того, как различные слои вашего приложения соединены вместе.Например, служба X принимает такие и такие реализации DAO.Это организация уровня приложения.Допустим, у вас есть сценарий, в котором вы хотите создать кнопку для каждой строки в списке - в этом случае вы можете использовать фабрику для создания кнопок.Этот сценарий основан на ситуации времени выполнения, когда в графическом интерфейсе есть разные элементы, которые вы не могли настроить заранее (потому что он основан на данных), поэтому DI здесь имеет меньше смысла.

РЕДАКТИРОВАТЬ - на основе вашего комментариявопросы, я думаю, что основной момент здесь заключается в том, что Spring также является контейнером Inversion of Control .Это означает, что вы не программируете, какие компоненты в вашем приложении идут куда.Без IoC вы можете сделать что-то вроде

MyServiceImpl extends MyService {
    Dao1 = new Dao1Impl(); // you programmatically configure which components go in here
    Dao2 = new Dao2Impl();
    ....
}

, вместо этого вы будете делать что-то вроде

MyServiceImpl extends MyService {
    public Dao1;  // you haven't specified which components, only interfaces
    public Dao2;
    ....
}

Во втором примере кода Spring (или что вы используете) будет внедрять соответствующие экземпляры DAOдля тебя.Вы переместили контроль над тем, какие компоненты использовать, на более высокий уровень.Таким образом, IoC и DI идут рука об руку, IoC способствует слабой связи, потому что в ваших определениях компонентов (то есть интерфейсах) вы только указываете поведение.

Другими словами, IoC и DI не нужны для слабой связи;у вас также может быть слабая связь с фабрикой

MyServiceImpl extends MyService {
    public dao1 
    public dao2;

    MyServiceImpl(){
       dao1 = DaoFactory.getDao1();
       ...
    }
    ....
}

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

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

0 голосов
/ 29 августа 2011

Но не мог понять, как пружина DI слабо связана и менее навязчива чем фабричные классы? в обоих случаях мы должны вставить какой-то получить объектный код в нашей основной программе.

Spring делает его менее навязчивым, потому что он использует отражение для автоматического «внедрения / создания» зависимостей. Таким образом, ваш код не нуждается в ссылке на фабрику.

Spring обычно используется для создания "синглтоноподобных" объектов. Люди обычно используют собственные фабрики для создания временных объектов (например, объектов запросов). Фактически, часто вы будете заставлять Spring создавать и внедрять ваши собственные фабрики (то есть фабрики фабрики).

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