2023. 1. 9. 09:39ใJAVA/Effective JAVA
item02. ์์ฑ์์ ๋งค๊ฐ๋ณ์๊ฐ ๋ง๋ค๋ฉด ๋น๋๋ฅผ ๊ณ ๋ คํ๋ผ.
" p17. ๋น๋ ํจํด"
๋น๋ํจํด 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๊ฐ ์ดํ๊ฑฐ๋, ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ๊ฑฐ์ ์๋ ๊ฐ์ฒด๋ผ๋๊ฐ, ๊ฐ์ฒด์ ์์ฑ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์์ํ๋ ๊ฒฝ์ฐ์๋ ๊ตณ์ด ๋น๋ํจํด์ ์ฌ์ฉํ์ง ์์๋ ๋๋ค.