티스토리 뷰
728x90
1. 의미
- 인스턴스 생성과 관련된 패턴으로 인스턴스를 생성할 때 동일한 프로세스를 통해 생성할 수 있게 도와주는 패턴
2. 작성 방법
public interface TourPlanBuilder {
TourPlanBuilder nightsAndDays(int nights, int days); // nights와 days는 같이 생성
TourPlanBuilder title(String title);
TourPlanBuilder startDate(LocalDate localDate);
TourPlanBuilder whereToStay(String whereToStay);
TourPlanBuilder addPlan(int day, String plan);
TourPlan getPlan();
}
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) {
/*
값이 들어올 때 마다 설정해주고
TourPlanBuilder 제공하는 또 다른 메소드를 사용할 수 있게
*/
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() {
/*
원하는 값을 갖는 TourPlan를 제공
*/
return new TourPlan(title, nights, days, startDate, whereToStay, plans);
}
}
public static void main(String[] args) {
TourPlanBuilder builder = new DefaultTourBuilder();
builder.title("칸쿤 여행")
.nightsAndDays(2, 3)
.startDate(LocalDate.of(2020, 12, 19))
.whereToStay("리조트")
.addPlan(0, "체크인하고 짐 풀기")
.addPlan(0, "저녁 먹기")
.getPlan();
}
2.1 같은 내용을 반복적으로 생성시 Director 클래스 사용
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();
}
}
public static void main(String[] args) {
// 칸쿤 여행을 반복적으로 생성해야한다면 TourDirector를 생성하여 사용 가능
TourDirector director = new TourDirector(new DefaultTourBuilder());
TourPlan tourPlan = director.cancunTrip();
}
3. 장단점
- 장점
- 생성하기 복잡한 객체를 순차적으로 생성 가능
- 순차적인 프로세스를 강제할 수 있고, 프로세스를 클라이언트가 순서를 따라갈 수 밖에 없다.
- 복잡한 객체를 생성할 때 필수 요소를 검증할 수 있다.
- 복잡한 과정을 숨겨서 깔끔한 소스 코드 작성
- 동일한 프로세스를 통해서 다른 객체를 생성
- 다른 builder를 생성하여 다른 인스턴스로 확장할 수 있다.
- 온전한, 완전한 객체가 생성되도록 안전장치 설정
- 마지막에 getPlan(); 를 해야만 인스턴스를 생성할 수 있다.
- getPlan에 체크리스트를 설정하여 필수 요소가 있는지 확인.
- 생성하기 복잡한 객체를 순차적으로 생성 가능
- 단점
- 기존보다 클래스 파일을 더 생성해야한다.
- 구조가 복잡하다.
- 기존엔 생성자로 만들지만 director를 통해 생성을 해야한다.
위글은 인프런의 코딩으로 학습하는 GoF의 디자인 패턴강의를 정리하였습니다.
백기선님의 수락으로 정리하였으며 더 자세한 내용은 강의를 수강하시기 바랍니다.
https://www.inflearn.com/course/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4/dashboard
728x90
'디자인 패턴' 카테고리의 다른 글
06. 어댑터 패턴 (0) | 2022.02.10 |
---|---|
05. 프로토타입 패턴 (0) | 2022.02.10 |
03. 추상 팩토리 패턴 (0) | 2022.02.10 |
02. 팩토리 메소드 패턴 (0) | 2022.02.10 |
01. 싱글톤 패턴 (0) | 2022.02.10 |
댓글