[์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] Item02 ์™„๋ฒฝ๊ณต๋žต. ๋นŒ๋” ํŒจํ„ด Builder Pattern

2023. 1. 9. 09:39ใ†JAVA/Effective JAVA

728x90

 

item02. ์ƒ์„ฑ์ž์— ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋งŽ๋‹ค๋ฉด ๋นŒ๋”๋ฅผ ๊ณ ๋ คํ•˜๋ผ. 

" p17. ๋นŒ๋” ํŒจํ„ด"

[์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] Item2. ์ƒ์„ฑ์ž์— ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋งŽ๋‹ค๋ฉด ๋นŒ๋”๋ฅผ ๊ณ ๋ คํ•˜๋ผ. (๋นŒ๋” ํŒจํ„ด) (tistory.com)

 

[์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] Item2. ์ƒ์„ฑ์ž์— ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋งŽ๋‹ค๋ฉด ๋นŒ๋”๋ฅผ ๊ณ ๋ คํ•˜๋ผ. (๋นŒ๋” ํŒจํ„ด)

์•„์ดํ…œ2. ์ƒ์„ฑ์ž์— ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋งŽ๋‹ค๋ฉด ๋นŒ๋”๋ฅผ ๊ณ ๋ คํ•˜๋ผ. [์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] Item2. ์ƒ์„ฑ์ž์— ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋งŽ๋‹ค๋ฉด ๋นŒ๋”๋ฅผ ๊ณ ๋ คํ•˜๋ผ. (์ ์ธต์  ์ƒ์„ฑ์ž ํŒจํ„ด, ์ž๋ฐ”๋นˆ์ฆˆ ํŒจํ„ด) (tistory.com) [์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] Ite

hyejin.tistory.com

 

 

 

 

๋นŒ๋”ํŒจํ„ด Builder Pattern ์ด๋ž€? 

: ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฑฐ์ณ ๋‹ค์–‘ํ•œ ๊ตฌ์„ฑ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• 

-> ๋ณต์žกํ•œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•  ์ˆ˜์žˆ๋‹ค. 

 

/**
 * ๋นŒ๋” ํŒจํ„ด
 */
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();
}

/**
 * ๋นŒ๋” ํŒจํ„ด
 */
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, startDate, days, nights, whereToStay, plans);
   }
}
public class DetailPlan
{
   private int day;
   
   private String plan;
   
   public DetailPlan(int day, String plan)
   {
      this.day = day;
      this.plan = plan;
   }
   
   public int getDay()
   {
      return day;
   }
   
   public void setDay(int day)
   {
      this.day = day;
   }
   
   public String getPlan()
   {
      return plan;
   }
   
   public void setPlan(String plan)
   {
      this.plan = plan;
   }
}
public class TourPlan
{
   private String title;
   private LocalDate startDate;
   private int nights;
   private int days;
   
   private String whereToStay;
   
   private List<DetailPlan> plans;
   
   public TourPlan(String title, LocalDate startDate, int nights, int days,
         String whereToStay, List<DetailPlan> plans)
   {
      this.title = title;
      this.startDate = startDate;
      this.nights = nights;
      this.days = days;
      this.whereToStay = whereToStay;
      this.plans = plans;
   }
   
   public String getTitle()
   {
      return title;
   }
   
   public void setTitle(String title)
   {
      this.title = title;
   }
   
   public LocalDate getStartDate()
   {
      return startDate;
   }
   
   public void setStartDate(LocalDate startDate)
   {
      this.startDate = startDate;
   }
   
   public int getNights()
   {
      return nights;
   }
   
   public void setNights(int nights)
   {
      this.nights = nights;
   }
   
   public int getDays()
   {
      return days;
   }
   
   public void setDays(int days)
   {
      this.days = days;
   }
   
   public String getWhereToStay()
   {
      return whereToStay;
   }
   
   public void setWhereToStay(String whereToStay)
   {
      this.whereToStay = whereToStay;
   }
   
   public List<DetailPlan> getPlans()
   {
      return plans;
   }
   
   public void setPlans(List<DetailPlan> plans)
   {
      this.plans = plans;
   }
}

 

/**
 * 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(2022, 1, 9))
            .whereToStay("๋ฆฌ์กฐํŠธ")
            .addPlan(0, "์ฒดํฌ์ธํ•˜๊ณ  ์ง ํ’€๊ธฐ")
            .addPlan(0, "์ €๋… ์‹์‚ฌ")
            .getPlan();
   }
   
   public TourPlan longBeachTrip()
   {
      return tourPlanBuilder.title("๋กฑ๋น„์น˜ ์—ฌํ–‰")
            .startDate(LocalDate.of(2023, 01, 9))
            .getPlan();
   }
   
   
}

Director๋Š” ๋นŒ๋”ํŒจํ„ด์—์„œ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ์˜ ์ฝ”๋“œ๋ฅผ ์ข€ ๋” ์ค„์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค. 

 

 

public class App
{
   public static void main(String[] args)
   {
      TourDirector tourDirector = new TourDirector(new DefaultTourBuilder());
      TourPlan tourPlan = tourDirector.cancunTrip();
   }
}

 

 

๋นŒ๋”ํŒจํ„ด Builder Pattern ์žฅ์  

- ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ. 

 

- ์œ ์—ฐ์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์Œ. 

 

- ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Œ. 

 

- ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Œ. 

: ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด setter๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ณ€๊ฒฝ์„ ํ•˜๊ณค ํ•˜๋Š”๋ฐ ์ด๋Š”, ๋ถˆํ•„์š”ํ•œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด๋‘์–ด, ์œ ์ง€๋ณด์ˆ˜์‹œ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ๋ฆฌ๋”ฉ์„ ์œ ๋ฐœํ•œ๋‹ค. ๋ฐ˜๋ฉด setter๊ฐ€ ์•„๋‹Œ ๊ฐ์ฒด ์ƒ์„ฑ์—์„œ๋งŒ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋ฉด ๊ฐ์ฒด์— ์ž˜๋ชป๋œ ๊ฐ’์ด ์žˆ๋”๋ผ๋„ ๊ทธ ์ง€์ ์„ ์ฐพ๊ธฐ ์‰ฝ๋‹ค. 

๋”ฐ๋ผ์„œ ํด๋ž˜์Šค ๋ณ€์ˆ˜๋Š” setter ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ๊ฐ์ฒด ์ƒ์„ฑ์œผ๋กœ ํ• ๋‹นํ•ด์„œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. 

 

 

 

๐Ÿ˜ƒ ๋นŒ๋”ํŒจํ„ด Builder Pattern 

๊ฐ์ฒด ์ƒ์„ฑ์— ๋Œ€ํ•ด์„œ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์— ๊ทธ๋ƒฅ ๋นŒ๋” ํŒจํ„ด์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. 

๋‚ด๊ฐ€ ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ๋„ ์•„๋‹ˆ๊ณ ...  ๋ณ€๊ฒฝ์ด ๋งŽ์€ ๊ฐ์ฒด๋ผ๋ฉด ๋นŒ๋” ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์ข‹๋‹ค. 

๋นŒ๋”ํŒจํ„ด์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ ๋กฌ๋ณต์˜ @Builder๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ ์•Œ์•„๋‘์ž ใ…Žใ…Ž ๊ทผ๋ฐ ๋กฌ๋ณต์œผ๋กœ Builder๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋‹จ์ ๋„ ์žˆ์œผ๋‹ˆ๊นŒ ์ž˜ ์ƒ๊ฐํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ 

๊ทผ๋ฐ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ 4๊ฐœ ์ดํ•˜๊ฑฐ๋‚˜, ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์ด ๊ฑฐ์˜ ์—†๋Š” ๊ฐ์ฒด๋ผ๋˜๊ฐ€, ๊ฐ์ฒด์˜ ์ƒ์„ฑ์„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์œ„์ž„ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ตณ์ด ๋นŒ๋”ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90