Java/Design Pattern

[헤드퍼스트 디자인 패턴] 12-2. 빌더 패턴

noahkim_ 2024. 12. 19. 00:08

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다

 

1. 빌더 패턴

  • 제품의 생산 단계를 캡슐화하여 여러 단계로 나눠서 만들도록 하는 패턴
  • 클라이언트는 추상 인터페이스로 제품을 단계적으로 생산

 

장점
  • 유연한 디자인이 필요할 경우
    • 여러 조합이 발생할 수 있음
    • 생성자가 너무 많아짐
  • 명확하게 객체를 생성할 수 있음
  • 제품의 내부 구조를 클라이언트로부터 보호할 수 있음

 

2. Vacation

VacationBuilder

public class Vacation {
    private String date;
    private String destination;
    private String accommodation;
    private List<String> activities;

    // Private constructor
    private Vacation(VacationBuilder builder) {
        this.date = builder.date;
        this.destination = builder.destination;
        this.accommodation = builder.accommodation;
        this.activities = builder.activities;
    }

    // Getters (Optional)
    public String getDate() { return date; }
    public String getDestination() { return destination; }
    public String getAccommodation() { return accommodation; }
    public List<String> getActivities() { return activities; }

    @Override
    public String toString() {
        return "Vacation{" +
                "date='" + date + '\'' +
                ", destination='" + destination + '\'' +
                ", accommodation='" + accommodation + '\'' +
                ", activities=" + activities +
                '}';
    }

    // Static nested Builder class
    public static class VacationBuilder {
        private String date;
        private String destination;
        private String accommodation;
        private List<String> activities = new ArrayList<>();

        public VacationBuilder(String date, String destination) { // 필수 항목
            this.date = date;
            this.destination = destination;
        }

        public VacationBuilder setAccommodation(String accommodation) {
            this.accommodation = accommodation;
            return this;
        }

        public VacationBuilder addActivity(String activity) {
            this.activities.add(activity);
            return this;
        }

        public Vacation build() {
            return new Vacation(this);
        }
    }
}