다양한 구성으로 만들어지는 인스턴스에 대해서 동일한 프로세스를 통해 만들 수 있게 도와주는 패턴. 객체를 만드는 프로세스를 독립적으로 분리할 수 있다.
Director
를 추가하여 빌더를 사용하면 반복되는 호출 스택을 빌더 내에 숨기고 client
는 Director
를 통해서 객체를 받아 사용할 수 있다.
public interface TourPlanBilder {
TourPlanBuilder title (String title);
TourPlanBuilder nightAndDays (int nights, int days);
//...
//값의 세팅 상태, 인스턴스 상태를 검증할 수 있음
TourPlan getPlan();
}
public class DefaultTourBuilder implements TourPlanBuilder {
// private fields
@Override
public TourPlanBuilder nightsAndDays(int nights, int days) {
this.nights = nights;
this.days = days;
return this;
}
@Override
public TourPlan getPlan() {
return new TourPlan(title, nights, days, startDate, whereToStay, plans);
}
}
public class App {
public static void main(String[] args) {
TourPlanBuilder builder = new DefaultTourBuilder();
builder.title("titile")
.nightAndDays(2, 3)
.startDate(localDate.of(2020, 12, 9))
.whereToStay("stay")
.addPlan(0, ",,,")
.getPlan();
TourPlan longBeachTrip
main에서 구현한 코드들을 builder 클래스로 이동하고 main App
클래스에서는 TourPlan tourPlan = director.메소드이름
형식으로 호출하여 wrapping
할 수 있다.
Stream<String> names = Stream.<String>builder().add("name").add("type").build();
Lombok
@Builder
를 적용하여 컴파일 시 Annotation 프로세서를 수행한다.
Spring : URIComponents
URI를 안전하게 만들 수 있다.