2021.11.27_빌더패턴02.패턴적용하기
본문 바로가기
CS Study/디자인패턴

2021.11.27_빌더패턴02.패턴적용하기

by KyeongMin 2021. 11. 27.
728x90
반응형

빌더 인터페이스 만들기

import java.time.LocalDate;

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

 

  • 이렇게 인터페이스에 여러개의 메소드를 저의한다.
  • 그리고 마지막에 getPlan을 생성함
    • 이 곳에서 만약에 nights를 설정했는데 days를 설정안했네를 확인해서
    • 값을 검증하는 것 , 인터페이스를 검증하는 위치임
package me.whiteship.designpatterns._01_creational_patterns._04_builder._01_before;

import java.time.LocalDate;

public class DefaultTourBuilder implements  TourPlanBuilder {

    public TourPlanBuilder nightsAndDays(int nights, int days) {
        return null;
    }

    public TourPlanBuilder title(String title) {
        return null;
    }

    public TourPlanBuilder startDate(LocalDate localDate) {
        return null;
    }

    public TourPlanBuilder whereToStay(String whereToStay) {
        return null;
    }

    public TourPlanBuilder addPlan(int day, String plan) {
        return null;
    }

    public TourPlanBuilder getPlan() {
        return null;
    }
}
  • 구현하기
package me.whiteship.designpatterns._01_creational_patterns._04_builder._02_after;

import me.whiteship.designpatterns._01_creational_patterns._04_builder._01_before.DetailPlan;
import me.whiteship.designpatterns._01_creational_patterns._04_builder._01_before.TourPlan;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

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);
    }
}
  • 항상 하던대로 하지만 마지막 getPlan에서 저렇게 인스턴스를 넘김

App | 클라이언트 부분

public class App{
    public static void main(String[] args){
		TourPlanBuilder builder = new DefaultTourBuilder();
        builder.title("칸쿤 여행");
        builder.nightAndDays(2,3);
    }
}
  • 위에 처럼 할 수 도 있지만
  • 빌더 타입이기 때문에
public class App{
    public static void main(String[] args){
		TourPlanBuilder builder = new DefaultTourBuilder();
        builder.title("칸쿤 여행")
            .nightAndDays(2,3)
            .startDate(LocalDate.of(2020,12,9))
            .whereToStay("리조트")
            .addPlan("리조트")
            .addPlan(0,"체크인하고 짐 풀기")
            .getPlan();
    }
}
  • 위와 같이 구현 할 수 있음
TourPlan longBeachTrip = builder.title("롱비치")
	.startDate(LocalDate.of(2021,7,15))
    .getPlan();
  • 이렇게 가능하다.
  • 이렇게 하면 생성자에서는 null값을 넣어서 해야겠지만 그럴 필요가 없음
  • 자주 반복되는 경우는 디렉터를 이용해서 사용하는 법이 있음

디렉터 사용

package me.whiteship.designpatterns._01_creational_patterns._04_builder._01_before;

public class TourDirector {
    //빌더를 이용해서 생성
    private TourPlanBuilder tourPlanBuilder;

    public TourPlanBuilder(TourPlanBuilder tourPlanBuilder){
        this.tourPlanBuilder = tourPlanBuilder;
    }
}
  • 이렇게 우선 생성하고 아래 자주 사용하는 것 넣기
package me.whiteship.designpatterns._01_creational_patterns._04_builder._02_after;

import me.whiteship.designpatterns._01_creational_patterns._04_builder._01_before.TourPlan;

import java.time.LocalDate;

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 class App{
    public static void main(String[] args){
	TourDirector dirctor = new TourDirector(new DefaultTourBilder());
     TourPlan tourPlan = director.cancunTrip();
     TourPlan tourPlan1 = director.lonBeachTrip();
    }
}
  • 이렇게 간단히 사용할 수 있음

https://github.com/3DPIT/study/blob/master/05.%EC%BD%94%EB%94%A9%EC%9C%BC%EB%A1%9C%ED%95%99%EC%8A%B5%ED%95%98%EB%8A%94GoF%EC%9D%98%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4/01.%EA%B0%9D%EC%B2%B4%EC%83%9D%EC%84%B1%EA%B4%80%EB%A0%A8%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4/2021/11/1127/%EB%B9%8C%EB%8D%94%ED%8C%A8%ED%84%B4/02.%ED%8C%A8%ED%84%B4%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0/2021.11.27_%EB%B9%8C%EB%8D%94%ED%8C%A8%ED%84%B402.%ED%8C%A8%ED%84%B4%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0.md

 

728x90
반응형

댓글