java | January 31, 2022
House
object를 만들고 싶다고 하자.
기본 집의 구조(4개의 벽, 바닥, 문, 창문, 지붕)만으로 집을 만들 수도 있지만, 더 크거나 밝거나 마당 또는 다른 것들이 추가된 집을 만들고 싶다면 어떻게 할까?
아래의 3가지 방법을 떠올릴 수 있다.
House
라는 base class를 만들고, parameter들을 다양하게 조합할 수 있는 subclass들을 생성한다.방법: House
object를 control 하는 모든 parameter를 사용하는 거대한 constructor를 생성한다.
(House(windows, doors, rooms, hasGarage, ...)
)
대부분 사용되는 parameter는 몇 개 되지 않아서 constructor의 호출이 지저분해진다.
예를 들어 수영장이 있는 집은 몇 없으므로, 수영장과 관련된 parameter는 대부분의 경우 쓸모가 없어진다.
자체 class에서 construction code를 따로 builders
라고 하는 별도의 object로 옮기도록 한다.
buildWalls
, buildDoor
과 같은 각각의 step을 나누고, 필요한 step만 호출할 수 있다.
builder에 있는 step을 client에서 각각 호출할 수도 있지만, director
class를 따로 둘 수도 있다.
director
는 각 step이 호출되는 순서를 알고 builder
에 있는 step을 호출해서 실행시킨다.
director
가 있다면 client code에서 product 구성의 세부 정보는 완전히 숨길 수 있다.
// Base class
interface HousePlan {
public void setBasement(String basement);
public void setRoof(String roof);
}
class House implements HousePlan {
private String basement;
private String roof;
public void setBasement(String basement) {
this.basement = basement;
}
public void setRoof(String roof) {
this.roof = roof;
}
}
// Builder
interface HouseBuilder {
public void buildBasement();
public void buildRoof();
public House getHouse();
}
class IglooHouseBuilder implements HouseBuilder {
private House house;
public IglooHouseBuilder() {
this.house = new House();
}
public void buildBasement() {
house.setBasement("Ice Bars");
}
public void buildRoof() {
house.setRoof("Ice Dome");
}
public House getHouse() {
return this.house;
}
}
// Director
class CivilEngineer {
private HouseBuilder houseBuilder;
public CivilEngineer(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
public House getHouse() {
return this.houseBuilder.getHouse();
}
public void constructHouse() {
this.houseBuilder.buildBasement();
this.houseBuilder.buildRoof();
}
}
class Builder {
public static void main(String[] args) {
HouseBuilder iglooBuilder = new IglooHouseBuilder();
CivilEngineer engineer = new CivilEngineer(iglooBuilder);
engineer.constructHouse();
House house = engineer.getHouse();
}
}