ジェネレータアレイ:ビルダーアレイビルダーアレイ


紹介する


これは、
  • と同じプロセスによって、異なる構成インタフェースを作成する方法です.
  • 複雑なオブジェクトを作成するプロセスを独立に分離できます.
  • 1)特徴

  • を作成すると、複雑なオブジェクトが順次作成されます.
  • 複雑なオブジェクトを作成する特定のプロセスを非表示にできます.
  • と同じプロセスからなる異なるオブジェクトを作成することもできます.
  • 不完全なオブジェクト
  • の使用を防止できます.
  • ビルドが必要なので、構造が複雑になります.
  • インプリメンテーション


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