Использование Dependency Injection как альтернативы синглетонам - PullRequest
6 голосов
/ 22 августа 2011

Я всегда знал, что Singletons «плохие», но только теперь, когда я перешел на Java с C ++, я решил найти способ обойти их. После небольшого прочтения я обнаружил, что Фабрики или Внедрение Зависимостей могли бы справиться с этой задачей, но я хотел бы получить подтверждение на этот счет.

В качестве примера я собирался написать синглтон AnimationCache, в котором будет храниться Map<String, Animation>. Разные классы должны иметь доступ к этому классу (в основном) где угодно, чтобы они могли легко и эффективно загружать анимации. Очень краткий пример того, как будет выглядеть эквивалентный код с использованием DI, был бы великолепен.

Кроме того, является ли Guice хорошей структурой для DI с не веб-приложениями? Я использовал Spring для веб-разработки, но я не уверен, что это подойдет для игр.

Ответы [ 3 ]

5 голосов
/ 22 августа 2011

Весна и Guice будут в порядке.Я лично предпочитаю Guice для чистого внедрения зависимостей, но Spring предлагает гораздо больше.

Код будет выглядеть так:

public class AnimationCacheClient {

    private AnimationCache cache;

    @Autowired // for Spring, or
    @Inject // for Guice (but I think Spring also supports it now)
    public AnimationCacheClient(AnimationCache cache) {
        this.cache = cache;
    }

    // ...
}

Я лично предпочитаю внедрение в конструктор, но вы также можете использовать setterинъекция или полевая инъекция.

Обратите внимание, что цель DI не состоит в том, чтобы иметь "легкие одиночки".Его основная цель - сделать код (из AnimationCacheClient здесь) легко модульно-устойчивым, внедряя фиктивные зависимости (здесь, макет AnimationCache экземпляр).

1 голос
/ 22 августа 2011

Я недавно "отказался" от этой нити в Singleton и от того, насколько она плоха (или нет), и что вы можете сделать, чтобы обойти ее.Стоит прочитать.

1 голос
/ 22 августа 2011

Используя Spring, DI очень прост. Используя аннотацию @Autowired, вам даже не понадобится дополнительный xml для подключения или метод установки. Участник в классе, которому нужен доступ к тому, кто был вашим синглтоном ранее, сделает это.

Вот хороший пример: http://www.developer.com/java/other/article.php/3756831/Java-Tip-Simplify-Spring-Apps-with-Autowired.htm

...