Effective Java 에서 언급하는 Supplier<T> 인터페이스는 자바에서 팩토리 메서드 패턴의 일반적인 구현을 제공하는 좋은 예입니다.
Supplier<T> 인터페이스는 자바 8에서 도입된 java.util.function 패키지의 일부로, 입력 없이 특정 타입의 객체를 공급하는 간단한 함수형 인터페이스입니다.
Supplier<T> 인터페이스
Supplier<T> 는 단 하나의 추상 메서드 get() 을 가지고 있습니다. 이 메서드는 매개변수를 받지 않고, 호출 될 때마다 새로운 또는 기존 객체를 반환할 수 있습니다. 반환 타입은 T로 Supplier 인터페이스를 구현할 때 지정됩니다.
@FunctionalInterface
public interface Supplier<T> {
T get();
}
팩터리 메서드 패턴으로서의 Supplier<T>
팩터리 메서드 패턴은 객체 생성 로직을 클라이언트로 부터 분리하고, 서브 클래스나 다른 클래스에 위임하여 객체의 생성을 관리하는 디자인 패턴입니다. Supplier<T> 를 사용하면 객체 생성과정을 캡슐화하고, 클라이언트 코드에 주입할 수 있습니다.
아래는 Supplier<T> 인터페이스를 사용한 객체 주입 예시 입니다. 특정 탭이 있고, 어떤 탭을 선택하느냐에 따라 화면이 다르게 보이는 코드 입니다.
public interface TabInterface {
void display();
}
public class NewsTabExam implements TabInterface {
@Override
public void display() {
System.out.println("\"display newsTab\" = " + "display newsTab");
}
}
public class SocialTabExam implements TabInterface {
@Override
public void display() {
System.out.println("\"display social Tab\" = " + "display social Tab");
}
}
public class Browser {
private final TabInterface tabInterface;
public Browser(Supplier<? extends TabInterface> tabInterface) {
this.tabInterface = tabInterface.get();
}
public void show() {
tabInterface.display();;
}
}
public class TabClient {
public static void main(String[] args) {
Browser browser = new Browser(NewsTabExam::new);
browser.show();
browser = new Browser(SocialTabExam::new);
browser.show();;
}
}
위 코드에서 보면 탭을 인터페이스로 정의하고 각각의 New 탭, Social 탭 으로 구현 하였습니다. 실제 Browser 에서는 탭 인터페이스를 주입 받아 show()를 하게 됩니다.
TabClient에서 객체를 주입할 때 Supplier로 주입 하였으며, Brower에서 한정적 와일드 카드 타입을 사용해 팩터리의 타입 매개변수를 제한 하였습니다.
'디자인패턴' 카테고리의 다른 글
디자인패턴 : 전략 패턴 (0) | 2024.05.09 |
---|---|
행동 패턴 (0) | 2023.12.12 |
생성 패턴 (0) | 2023.12.12 |
구조 패턴 (0) | 2023.12.12 |