동일한 프로세스를 거쳐 다양한 구성의 인스턴스를 만드는 방법
복잡한 객체를 만드는 프로세스를 독립적으로 분리할 수 있다.
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();
}
TourPlan 객체를 만들기 위한 인터페이스이다. TourPlan에 필요한 인스턴스 변수들을 초기화하는 추상메서드들을 정의하고 마지막에 TourPlan 객체를 리턴하는 추상 메서드를 정의해준다
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);
}
}
TourPlanBuilder 인터페이스의 구현 클래스이다. 추상메서드들을 구현해주고 각 메서드들에서 필요한 초기화 조건들을 작성하여 데이터 검증을 할 수 있다.
public class TourDirector {
private final 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를 매개변수로 받는 실제 클라이언트가 객체생성을 위해 사용할 클래스이다. 상황에 따라 TourPlanBuilder의 구현 클래스를 교체하여 사용할 수 있기 때문에 매개변수로 받아서 초기화되며 여러 종류의 TourPaln들을 생성하기 위한 메서드들을 작성해준다.
이 클래스는 빌더패턴을 사용하기 위해 꼭 필요한 것은 아니며 클라이언트에서 좀 더 깔끔하게 객체 생상을 할 수 있도록 미리 정의된 함수들로 TourPlan 객체를 생성해주는 일종의 팩토리 클래스로 볼 수 있을것 같다.
public class App {
public static void main(String[] args) {
TourDirector director = new TourDirector(new DefaultTourBuilder());
TourPlan tourPlan = director.cancunTrip();
TourPlan tourPlan1 = director.longBeachTrip();
}
}
실제 클라이언트에서는 위와 같이 사용한다.
- 장점
- 만들기 복잡한 객체를 순차적으로 만들 수 있다
- 복잡한 객체를 만드는 구체적인 과정을 숨길 수 있다
- 동일한 프로세스를 통해 각기 다르게 구성된 객체를 만들 수도 있다
- 불완전한 객체를 사용하지 못하도록 방지할 수 있다
- 단점
- 원하는 객체를 만들려면 빌더부터 만들어야 한다
- 구조가 복잡해진다
'java' 카테고리의 다른 글
Design Patterns - Adapter (0) | 2021.11.24 |
---|---|
Design Patterns - Prototype (0) | 2021.11.22 |
Design Patterns - Abstract Factory (0) | 2021.11.20 |
Design Patterns - Factory Method (0) | 2021.11.17 |
Design Patterns - Singleton (0) | 2021.11.11 |
댓글