본문 바로가기
java

Design Patterns - Builder

by 쭈꾸마뇽 2021. 11. 21.

동일한 프로세스를 거쳐 다양한 구성의 인스턴스를 만드는 방법

복잡한 객체를 만드는 프로세스를 독립적으로 분리할 수 있다.

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

실제 클라이언트에서는 위와 같이 사용한다.

  • 장점
    • 만들기 복잡한 객체를 순차적으로 만들 수 있다
    • 복잡한 객체를 만드는 구체적인 과정을 숨길 수 있다
    • 동일한 프로세스를 통해 각기 다르게 구성된 객체를 만들 수도 있다
    • 불완전한 객체를 사용하지 못하도록 방지할 수 있다
  • 단점
    • 원하는 객체를 만들려면 빌더부터 만들어야 한다
    • 구조가 복잡해진다

 

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

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

www.inflearn.com

'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

댓글