사용하는 자원에 따라 동작이 달라지는 클래스에는 ~정적 유틸리티 클래스~나 ~싱글턴 방식~이 적합하지 않다.

이 조건을 만족하는 간단한 패턴은, 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식이다.

인용에서 말했듯이 사용 하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나

싱글턴 방식이 어울리지않다.

만약 해당 클래스에 두 가지 방법을 적용할 경우, 유연하지 않고 테스트도 어려워진다.

그렇기 때문에 사용하는 자원의 의존성을 밖으로 분리하여 외부에서 주입을 받아서 동작하도록 해야한다 (의존 객체 주입 패턴)

public class SpellChecker { 
	private final Lexicon dictionary; 

	private SpellChecker(Lexicon dictionary) { 
    		this.dictionary = Objects.requireNonNull(dictionary); 
 	} 

	public boolean isValid(String word) { return true; } 
	public List<String> suggestions(String typo) { return null; } 
}

코드로 보면 dictionary 라는 사용자원을 SpellChecker라는 인스턴트를 생성할 때,

외부에서 어떤 dictionary 인지는 모르지만 dictionary를 주입 받아서 인스턴트가 생성된다.

이러한 의존 객체 주입 패턴은 불변을 보장(fianl에 의해서)해주기 때문에 여러 클라이언트가 의존 객체들을 안심하고 공유할 수 있다.

팩터리 메서드 패턴

생성자에 자원 팩터리를 넘겨주는 방식 (팩터리: 호출할 때마다 특정 타입의 인스턴스를 반복해서 만들어주는 객체)

ex) Supplier<T> 인터페이스