[Design Pattern] Builder

Yeonjae Im·2021년 8월 16일
0

디자인 패턴

목록 보기
1/2

의미

  • 복잡한 객체를 단계별로 만들 수 있게 해주는 디자인 패턴

문제 상황

집이라는 객체를 생성하고 싶을 때 사용하는 방법에는 2가지가 있다.

  1. 상속을 마구마구 시키기
  • 단점
    • 자식 클래스들이 감당할 수 없을만큼 많아질 수 있다.

  1. 생성자에 가능한 옵션들을 다 추가시키기

해결 방법

  • Builder 인터페이스에 생성 메소드를 따로 만들어서 분리시켜주자!

구조

예시 및 구현 방법

  • 사용자의 요구에 맞는 집을 짓는 과정을 코드로 구현
  1. Builder 인터페이스에 생성 과정을 선언한다.
public interface Builder {
    void setMaterial(Material material);
    void setDoor(int doors);
    void setWindow(int windows);
    void setRoom(int rooms);
}
  1. 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);
    }
}
  1. 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);
    }

}
  1. ClientBuilderDirector 객체를 생성한 후, 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()

장단점

장점

  • 단계별로 객체를 생성할 수 있다.
  • 생성 코드를 재사용할 수 있다.
  • Single Responsibility Principle
    - Client 단에서 생성 과정을 명시할 필요가 없다.

단점

  • 다수의 class를 생성해야 해서 코드가 복잡해진다.

참고

0개의 댓글