장점 : Setter를 사용하지 않기 때문에 객체가 변경되는 일을 최소화할 수 있다.
절차에 따라 진행되기 때문에 매개변수가 많아져도 가독성을 높일 수 있다.
생성 과정 중 필요한 데이터들을 강제하거나 혹은 필요 없는 데이터는 설정하지 않게 할 수 있도록 유연하게 사용할 수 있다.
단점 : 매개변수가 많아질 경우 Setter로 할 때보다 필요한 클래스나 코드의 양이 늘어날 수 있다.
public class DefaultTourBuilder implements TourPlanBuilder {
private TourPlan tourPlan;
@Override
public DefaultTourBuilder newInstance() {
this.tourPlan = new TourPlan();
return this;
}
@Override
public TourPlanBuilder nightsAndDays(int nights, int days) {
this.tourPlan.setNights(nights);
this.tourPlan.setDays(days);
return this;
}
@Override
public TourPlanBuilder title(String title) {
this.tourPlan.setTitle(title);
return this;
}
@Override
public TourPlanBuilder startDate(LocalDate startDate) {
this.tourPlan.setStartDate(startDate);
return this;
}
@Override
public TourPlanBuilder whereToStay(String whereToStay) {
this.tourPlan.setWhereToStay(whereToStay);
return this;
}
@Override
public TourPlanBuilder addPlan(int day, String plan) {
if (tourPlan.getPlans() == null) {
this.tourPlan.setPlans(new ArrayList<>());
}
this.tourPlan.getPlans().add(new DetailPlan(day, plan));
return this;
}
@Override
public TourPlan getPlan() {
return tourPlan;
}
}
public static void main(String[] args) {
Stream<Integer> stream = Stream.of(1, null, 3, 4, null);
List<Integer> collect = stream.filter(Objects::nonNull).collect(Collectors.toList());
}
public static void main(String[] args) {
(Uri 생성) components = UriComponentsBuilder.newInstance()
.scheme("https")
.host("www.naver.com")
.path("news")
.build().encode();
}
출처 : 백기선님의 디자인패턴