생성자 패턴: 빌더 패턴

xellos·2022년 3월 30일
0

디자인 패턴

목록 보기
4/20

소개

  • 동일한 프로세스를 거쳐 다양한 구성의 인터페이스를 만드는 방법이다.
  • 복잡한 객체를 만드는 프로세스를 독립적으로 분리할 수 있다.

1) 특징

  1. 만들기 복잡한 객체를 순차적으로 만들 수 있다.
  2. 복잡한 객체를 만드를 구체적인 과정을 숨길 수 있다.
  3. 동일한 프로세스로 각기 다르게 구성된 객체를 만들수도 있다.
  4. 불완전한 객체를 사용하지 못하도록 방지할 수 있다.
  5. 빌더가 필요하기 때문에 구조가 복잡해진다.

구현

1) 인스턴스로 만들 클래스 정의

@Setter
@Getter
@ToString
public class TourPlan {
	private String title;
    private int nights;
    private int days;
    private LocalDate startDate;
    private String whereToStay;
    private List<DetailPlan> plans;
    
    public TourPlan() {}
    
    public TourPlan(
    	String title, int nights, int days, LocalDate startDate,
        String whereToStay, List<DetailPlan> plans
    ) {
    	this.title = title;
        this.nights = nights;
        this.days = days;
        this.startDate = startDate;
        this.whereToStay = whereToStay;
        this.plans = plans;
    }
    
    public void addPlan(int day, String plan) {
    	this.plans.add(new DetailPlan(day, plan));
    }
}

2) Builder 인터페이스를 생성

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();
}

3) 인터페이스 구현

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 localDate) {
    	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);
    }
}

사용

public class TourDirector {
	private TourPlanBuilder tourPlanBuilder;
    
    private 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(LoalDate.of(2021, 7, 15))
                    .getPlan();
    }
}

0개의 댓글