티스토리 뷰

디자인 패턴

04. 빌더패턴

jin-park 2022. 2. 10. 16:53

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

 

코딩으로 학습하는 GoF의 디자인 패턴 - 인프런 | 강의

디자인 패턴을 알고 있다면 스프링 뿐 아니라 여러 다양한 기술 및 프로그래밍 언어도 보다 쉽게 학습할 수 있습니다. 또한, 보다 유연하고 재사용성이 뛰어난 객체 지향 소프트웨어를 개발할

www.inflearn.com

 

'디자인 패턴' 카테고리의 다른 글

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
댓글