집이라는 객체를 생성하고 싶을 때 사용하는 방법에는 2가지가 있다.
Builder
인터페이스에 생성 메소드를 따로 만들어서 분리시켜주자!
Builder
인터페이스에 생성 과정을 선언한다.public interface Builder {
void setMaterial(Material material);
void setDoor(int doors);
void setWindow(int windows);
void setRoom(int rooms);
}
ConcreteBuilder
클래스에 집의 정보를 출력하는 메소드를 만들고, 생성 과정을 구현한다.public class HouseBuilder implements Builder {
private Material material;
private int doors;
private int windows;
private int rooms;
@Override
public void setMaterial(Material material) {
this.material = material;
}
@Override
public void setDoor(int doors) {
this.doors = doors;
}
@Override
public void setWindow(int windows) {
this.windows = windows;
}
@Override
public void setRoom(int rooms) {
this.rooms = rooms;
}
public House getResult() {
return new House(material, doors, windows, rooms);
}
}
Director
클래스는 선택. 집을 짓는 순서를 정의한다. 사용자가 원하는 종류의 집을 지을 수 있다.public class Director {
public void constructBrickHouse(Builder builder) {
builder.setMaterial(Material.BRICK);
builder.setWindow(2);
builder.setDoor(1);
builder.setRoom(3);
}
public void constructOneRoomHouse(Builder builder) {
builder.setMaterial(Material.BRICK);
builder.setWindow(1);
builder.setRoom(1);
}
}
Client
는 Builder
와 Director
객체를 생성한 후, Director
에게 Builder
객체를 주어 원하는 집을 짓게 한다.public class Client {
public static void main(String[] args) {
Director director = new Director();
HouseBuilder builder = new HouseBuilder();
director.constructBrickHouse(builder);
House house = builder.getResult();
System.out.println(house);
}
}
Java.lang.StringBuilder#append()
Java.lang.StringBuffer#append()
Client
단에서 생성 과정을 명시할 필요가 없다.