포스트

[Creational Pattern] 빌더 패턴 (Builder Pattern)

Design Pattern / Creational Pattern

빌더 패턴의 정의와 해당 디자인 패턴의 예제 코드를 통한 이해 및 설명 정리

개념

  • 복잡한 객체의 생성 과정과 표현 방법을 분리하여 다양한 구성의 인스턴스를 만드는 생성 패턴

  • 생성자에 들어갈 매개 변수를 메서드로 하나하나 받아들이고 마지막에 통합 빌드해서 객체를 생성하는 방식

  • 예를 들면 수제 햄버거와 같은 느낌

    builder_example

패턴 구조

builder

예제 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
class Request {
  constructor(defaultUrl) {
    if (defaultUrl) {
      this.defaultUrl = defaultUrl;
      this.url = "";
      this.method = "GET";
      this.query = "";
      this.method === "POST" ? (this.data = data) : null;
    }
  }
}

class RequestBuilder {
  constructor(defaultUrl) {
    this.request = new Request(defaultUrl);
  }

  setUrl(url) {
    this.request.url = url;
    return this;
  }

  setMethod(method) {
    this.request.method = method;
    return this;
  }

  setData(data) {
    this.request.data = data;
    return this;
  }

  setQuery(query) {
    if (query) {
      const querys = `?${query.map((res) => res)}`;
      const requestQuery = querys.replaceAll(",", "&");
      this.request.query = requestQuery;
    }

    return this;
  }

  build() {
    const { request } = this;
    request.requestUrl = `${request.defaultUrl}${request.url}${
      request.query && request.query
    }`;
    return request;
  }
}

module.exports = { RequestBuilder };

// https://rojy53nt54.execute-api.ap-northeast-2.amazonaws.com/Prod/
1
2
3
4
5
6
7
8
9
10
11
const { RequestBuilder } = require("./builder");

const request = new RequestBuilder(
  "https://rojy53nt54.execute-api.ap-northeast-2.amazonaws.com/Prod"
)
  .setMethod("GET")
  .setUrl("/devices/wando02/sensors")
  .setQuery(["size=1", "b_time=10", "a_time=100"])
  .build();

console.log(request);

참고한 출처 사이트

Refactoring GURU

Inpa Dev Blog (디자인 패턴)

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.