많은 클래스는 하나 이상의 자원에 의존한다. ex) 맞춤법 검사기는 사전에 의존한다.
이때, 사전과 같은 클래스를 유틸리티 클래스로 구현하는 경우가 많다
그러나, 이러한 구현은 사전이 단 하나만 존재한다는 가정에서부터 실무에서는 사용이 어렵다
클래스에서 새터 등을 통해 다른 사전으로 교체하는 메서드를 사용할 수는 있겠으나, 오류를 내기 쉽고, 멀티스레드 환경에서 동작하지 않는다.
사용하는 자원에 따라 동작이 달라지는 클래스는 정적 유틸리티 클래스, 싱글턴 클래스가 적합하지 않다.
인스턴스를 생성할 때, 생성자에 필요한 자원을 넘겨주어 그때그때 알맞은 클래스를 활용한다. - 의존 객체 주입의 한 형태
자원이 많아도, 의존 관계가 어떻게 복잡하게 얽혀 있어도, 관계없이 잘 작동
생성자에 자원 팩터리를 넘겨주는 방식으로 변형하여 명시한 타입의 하위 타입은 무엇이든 반환 가능 (Supplier<T>, 이를 이용해 의존 객체 주입 프레임워크가 만들어짐)
클래스가 내부적으로 하나 이상의 자원에 의존하고, 그 자원이 클래스 동작에 영향을 준다면, 유틸리티, 싱글턴 클래스는 적합하지 않다 (정적이므로) 대신 필요한 자원을 넘겨주자. 의존 객체 주입이라 하는 이 기법은 클래스의 유연성, 재사용성, 테스트 용이성을 기막히게 개선해준다.