디자인 패턴 : Builder Pattern

정의

복잡한 객체를 생성하는 방법과 표현하는 방법을 정의하는 클래스를 분리하는 패턴

특징

  • 빌더에 의해 객체 생성방법이 추상화 되기 때문에 객체 생성 난이도가 낮아지며, 객체 생성방법이 클라이언트로 부터 어느정도 자유로워 질 수 있다.

    외부에는 간결한 인터페이스를 제공하고, 내부적으로는 복잡한 생성로직을 처리한다.

예제코드

객체 생성을 위해 필요한 정보를 추상화된 인터페이스를 통하여 입력받고, 객체 생성 시점에 조립한다는 생각으로 설계한다.

간단한 빌더패턴

class UrlRole {

  private final String url;
  private final Set<String> role;
  private final Set<Method> method;

  private UrlRole(String url, Set<String> role, Set<Method> method) {
    this.url = url;
    this.role = role;
    this.method = method;
  }

  static UrlRoleBuilder url(String url, Method... methods) {
    return new UrlRoleBuilder(url, methods);
  }

  @Override
  public String toString() {
    return "UrlRole{" +
        "url='" + url + '\'' +
        ", role=" + role +
        ", method=" + method +
        '}';
  }

  @SuppressWarnings({"UseBulkOperation", "ManualArrayToCollectionCopy"})
  public static class UrlRoleBuilder {
    private String url;
    private Set<String> roles;
    private Set<Method> methods;

    UrlRoleBuilder(String url, Method... methods) {
      this.url = url;
      this.roles = new HashSet<>();
      this.methods = new HashSet<>();
      for (Method each : methods) {
        this.methods.add(each);
      }
    }

    public UrlRoleBuilder hasAnyRole(String... role) {
      for (String each : role) {
        roles.add(each);
      }
      return this;
    }

    public UrlRole build() {
      validate();
      if (methods.isEmpty()) {
        for (Method each : Method.values()) {
          methods.add(each);
        }
      }
      return new UrlRole(url, roles, methods);
    }

    private void validate() {
      // do something for validate)
    }
  }
}

참고자료

GoF의 디자인 패턴 p144 - p155

태그:

Back to Top ↑

댓글남기기