빌더 패턴(Builder Pattern)
디자인패턴 공부하기
  • JavaScript

여러가지 디자인 패턴에 대해 정리해보고자 합니다.
두 번째로 빌더 패턴에 대해 작성해보겠습니다.

빌더 패턴(Builder Pattern)

추상 팩토리의 확장 개념으로 좀 더 많은 빌드패턴이 있을 때 유용하게 사용합니다.

간단한 예제를 통해 이해해봅니다.
지난 예제에는 커피를 만들었다면 이번에는 좀 더 큰 커피가게를 만들어보겠습니다.

const makeShop = function(shopName) {
  let coffeeTypes = [];
  let employeeCount = 0;
  
  return {
    setCoffeeTypes = function(types) {
      coffeeTypes = types;
      return this;
    },
    setEmployeeCount = function(count) {
      employeeCount = count;
      return this;
    },
    build = function() {
      return {
        showName,
        coffeeTypes,
        employeeCount,
      }
    }
  }
}

이제 우리는 다음과 같이 커피 가게를 찍어낼 수 있습니다.

const Starbucks = makeShop('Starbucks').setCoffeeTypes(['Ameracano', 'CafeLatte', 'ColdBrew']).setEmployeeCount(3).build();
const Pascucci = makeShop('Pascucci').setCoffeeTypes(['Ameracano', 'Yogurt']).setEmployeeCount(2).build();

한개의 함수를 통해 여러가지 가게를 손쉽게 찍어낼 수 있습니다.
여기서 아쉬운게 있습니다.

그것은 가게를 만들고 가게를 오픈하는 하는 기능을 만들고 싶습니다.
그래서 우리는 다음과 같이 수정할 수 있습니다.

const Shop = (function() {
  function Shop(shopName, coffeeTypes, employeeCount) {
    this.shopName = shopName;
    this.coffeeTypes = coffeeTypes;
    this.employeeCount = employeeCount;
  }
  
  Shop.prototype.open = function() {
    console.log(`${this.coffeeTypes}의 종류를 판매중인 ${this.shopName}가게가 ${this.employeeCount}의 직원수로 오픈했습니다!`);
  }
  
  return Shop;
})


const makeShop = function(shopName) {
  let coffeeTypes = [];
  let employeeCount = 0;
  
  return {
    setCoffeeTypes = function(types) {
      coffeeTypes = types;
      return this;
    },
    setEmployeeCount = function(count) {
      employeeCount = count;
      return this;
    },
    build = function() {
      return new Shop(showName, coffeeTypes, employeeCount);
    }
  }
}

위와같이 코드를 수정했습니다.

Starbucks.open(); // 'Ameracano', 'CafeLatte', 'ColdBrew'의 종류를 판매중인 Starbucks가게가 3의 직원수로 오픈했습니다!

기존 makeShop에서 가게에 메서드까지 추가됐다는것이 변경되었습니다.