소개
- 동일한 프로세스를 거쳐 다양한 구성의 인터페이스를 만드는 방법이다.
- 복잡한 객체를 만드는 프로세스를 독립적으로 분리할 수 있다.

1) 특징
- 만들기 복잡한 객체를 순차적으로 만들 수 있다.
- 복잡한 객체를 만드를 구체적인 과정을 숨길 수 있다.
- 동일한 프로세스로 각기 다르게 구성된 객체를 만들수도 있다.
- 불완전한 객체를 사용하지 못하도록 방지할 수 있다.
- 빌더가 필요하기 때문에 구조가 복잡해진다.
구현
1) 인스턴스로 만들 클래스 정의
@Setter
@Getter
@ToString
public class TourPlan {
private String title;
private int nights;
private int days;
private LocalDate startDate;
private String whereToStay;
private List<DetailPlan> plans;
public TourPlan() {}
public TourPlan(
String title, int nights, int days, LocalDate startDate,
String whereToStay, List<DetailPlan> plans
) {
this.title = title;
this.nights = nights;
this.days = days;
this.startDate = startDate;
this.whereToStay = whereToStay;
this.plans = plans;
}
public void addPlan(int day, String plan) {
this.plans.add(new DetailPlan(day, plan));
}
}
2) Builder 인터페이스를 생성
public interface TourPlanBuilder {
TourPlanBuilder nightsAndDays(int nights, int days);
TourPlanBuilder title(String title);
TourPlanBuilder startDate(LocalDate localDate);
TourPlanBuilder whereToStay(String whereToStay);
TourPlanBuilder addPlan(int day, String plan);
TourPlan getPlan();
}
3) 인터페이스 구현
public class DefaultTourBuilder implements TourPlanBuilder {
private String title;
private int nights;
private int days;
private LocalDate startDate;
private String whereToStay;
private List<DetailPlan> plans;
@Override
public TourPlanBuilder nightsAndDays(int nights, int days) {
this.nights = nights;
this.days = days;
return this;
}
@Override
public TourPlanBuilder title(String title) {
this.title = title;
return this;
}
@Override
public TourPlanBuilder startDate(LocalDate localDate) {
this.startDate = startDate;
return this;
}
@Override
public TourPlanBuilder whereToStay(String whereToStay) {
this.whereToStay = whereToStay;
return this;
}
@Override
public TourPlanBuilder addPlan(int day, String plan) {
if(this.plans == null) {
this.plans = new ArrayList<>();
}
this.plans.add(new DetailPlan(day, plan));
return this;
}
@Override
public TourPlan getPlan() {
return new TourPlan(title, nights, days, startDate, whereToStay, plans);
}
}
사용
public class TourDirector {
private TourPlanBuilder tourPlanBuilder;
private TourDirector(TourPlanBuilder tourPlanBuilder) {
this.tourPlanBuilder = tourPlanBuilder;
}
public TourPlan cancunTrip() {
return tourPlanBuilder.title("칸쿤 여행")
.nightsAndDays(2, 3)
.startDate(LocalDate.of(2020, 12, 9))
.whereToStay("리조트")
.addPlan(0, "체크인하고 짐 풀기")
.addPlan(0, "저녁 식사")
.getPlan();
}
public TourPlan longBeachTrip() {
return tourPlanBuilder.title("롱비치")
.startDate(LoalDate.of(2021, 7, 15))
.getPlan();
}
}