본문 바로가기
디자인패턴

자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 - Supplier<T> 인터페이스가 팩토리를 표현하는 완벽한 예이다

by 이상한나라의개발자 2024. 4. 17.

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