728x90
반응형
Builder Pattern
동일한 프로세스를 거쳐 다양한 구성의 인스턴스를 만드는 방법
(복잡한) 객체를 만드는 프로세스를 독립적으로 분리할 수 있다.
구현방법
App
public class App {
public static void main(String[] args) {
TourDirector director = new TourDirector(new DefaultTourBuilder());
TourPlan tourPlan = director.cancunTrip();
TourPlan tourPlan1 = director.longBeachTrip();
}
}
TourPlan & Detail Plan
public class TourPlan {
private String title;
private int nights;
private int days;
private LocalDate startDate;
private String whereToStay;
private List<DetailPlan> plans;
}
public class DetailPlan {
private int day;
private String plan;
}
TourDirector
public class TourDirector {
private TourPlanBuilder tourPlanBuilder;
public 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(LocalDate.of(2021, 7, 15))
.getPlan();
}
}
TourPlanBuilder
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();
}
DefaultTourBuilder
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 startDate) {
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);
}
}
[ 패턴 복습 ]
장점 | 단점 |
- 만들기 복잡한 객체를 순차적으로 만들 수 있다. - 복잡한 객체를 만드는 구체적인 과정을 숨길 수 있다. - 동일한 프로세스를 통해 각기 다르게 구성된 객체를 만들수 있다. - 불완전한 객체를 사용하지 못하도록 막을 수 있다. |
- 원하는 객체를 만들려면 빌더를 만들어야 한다. - 구조가 복잡해진다.(트레이드오프) |
728x90
반응형
'Design Patterns > 생성(Creational)' 카테고리의 다른 글
[Prototype]프로토타입 패턴 (0) | 2022.05.31 |
---|---|
[Abstract factory]추상팩토리 (0) | 2022.05.25 |
[FactoryMethod]장점과 단점 (0) | 2022.05.20 |
[Singleton]4. 자바와 스프링에서 찾아보는 패턴 (0) | 2022.04.08 |
[Singleton]3. 안전하고 단순하게 구현하는 방법 (0) | 2022.04.07 |