인프런 커뮤니티 질문&답변

Seungyeon Yi님의 프로필 이미지
Seungyeon Yi

작성한 질문수

코딩으로 학습하는 GoF의 디자인 패턴

빌드 패턴 강의 관련 질문입니다.

해결된 질문

작성

·

168

0

빌드 패턴 강의 중 문의 드립니다.

예제 중 아래 코드를 실행해보았습니다.

 

그랬더니 tourPlan값은 정상적으로 원하는 값이 들어갔지만, tourPlan1은 원치 않는 값까지 입력된 부분을 확인하였습니다.

 

DefaultBuilder을 주입 받기 때문에 생기는 문제라고 판단되는데, DefaultBuilder를 주입받아 상용하도록 구성한 이유가 있을까요??

그리고 TourDirector를 아래와 같이 수정하여 보았는데, 혹시 이렇게 사용하면 이슈가 있을까요?? 

public class TourDirector {

    public TourPlan cancunTrip() {
        TourPlanBuilder tourPlanBuilder = new DefaultTourBuilder();
        return tourPlanBuilder.title("칸쿤 여행")
                .nightsAndDays(2, 3)
                .startDate(LocalDate.of(2020, 12, 9))
                .whereToStay("리조트")
                .addPlan(0, "체크인하고 짐 풀기")
                .addPlan(0, "저녁 식사")
                .getPlan();
    }

    public TourPlan longBeachTrip() {
        TourPlanBuilder tourPlanBuilder = new DefaultTourBuilder();
        return tourPlanBuilder.title("롱비치")
                .startDate(LocalDate.of(2021, 7, 15))
                .getPlan();
    }
}

 

답변 1

2

백기선님의 프로필 이미지
백기선
지식공유자

안녕하세요. 좋은 질문 감사합니다.

TourDirector가 인터페이스만 사용할 수 있도록 만들려면 구체적인 빌더인 DefaultTourBuilder를 만들어 사용하는게 아니라 TourPlanBuilder라는 인터페이스 타입만 사용하도록 코드를 유지하려는 의도가 있습니다.

그리고 말씀하신 문제는 미쳐 생각하지 못했는데 찾아주셔서 감사합니다. 보여주신 방법도 한가지 해결책이 될 수 있는데 한가지 문제는 구체적인 타입에 의존성이 생긴다는 것이라서 저라면 이런식으로 해결할 수 있을 것 같아요. 

또는 빌더 내부에 TourPlan 초기화용 메소드를 하나 만들어서 newTour()처럼, 항상 해당 메소드부터 메소드 체이닝을 시작하는 것도 한가지 방법이 될 수 있겠습니다.

public static void main(String[] args) {
TourDirector director = new TourDirector();
TourPlan tourPlan = director.cancunTrip(new DefaultTourBuilder());
TourPlan tourPlan1 = director.longBeachTrip(new DefaultTourBuilder());
}
public class TourDirector {

public TourPlan cancunTrip(TourPlanBuilder tourPlanBuilder) {
return tourPlanBuilder.title("칸쿤 여행")
.nightsAndDays(2, 3)
.startDate(LocalDate.of(2020, 12, 9))
.whereToStay("리조트")
.addPlan(0, "체크인하고 짐 풀기")
.addPlan(0, "저녁 식사")
.getPlan();
}

public TourPlan longBeachTrip(TourPlanBuilder tourPlanBuilder) {
return tourPlanBuilder.title("롱비치")
.startDate(LocalDate.of(2021, 7, 15))
.getPlan();
}
}
Seungyeon Yi님의 프로필 이미지
Seungyeon Yi

작성한 질문수

질문하기