자바 스크립트와 디자인 패턴 : 생성 패턴 - 빌더 패턴

Junebeom Lee·2021년 7월 22일
0

빌더 패턴

빌더 패턴은 생성 인자가 많을 시, 빌더 객체를 통해 구체적인 객체를 생성

자바 클래스 오버로팅 생성자에서 아래 같은 형식을 본 적이 있을 것이다.

public class Person{
    private String name;
    private int age;
    private int height;
    
    public Person(String name){
    this.name = name;
    }
    public Person(String name, int age){
    this.name = name;
    this.age = age;
    }
    public Person(String name, int age, int height){
    this.name = name;
    this.age = age;
    this.height = height;
    }
} 

위와 같은 방법은 원하는 신상 정보만 등록할 수 있다. 하지만 문제가 있다.

  1. 이름(name)과 키(height)만 입력하려는 경우
  2. 인자가 너무 많아져서 구분하기 어려워질 경우
  3. 새로운 인자를 추가할때마다 새로운 생성자를 생성해야 하는 경우

이를 위한 빌더 클래스를 아래와 같이 작성할 것이다.

public  class PersonBuild{
    private String name;
    private int age;
    private int height;
    
    public PersonBuild name(String name){this.name = name; return this;}
    public PersonBuild age(String age){this.age = age; return this;}
    public PersonBuild height(String height){this.height = height; return this;}
    public Person build(){
    	Person thisPerson = new Person(name,age,height);
        return thisPerson
    }
}

빌더 클래스가 완성된 후에 생성자를 부를 때 아래와 같이 작성할 수 있다.

PersonBuild personbuild = new Personbuild();
Pesron person = psersonbuild
    .name("tatiana")
    .age("26")
    .height("165")
    .build();
  1. 불필요한 생성자를 만들지 않는다.
  2. 인자들의 가독성이 좋아진다.
  3. 인자들의 순서가 섞여도 상관 없다.

여기서 멈출 수 없다. Javascript로 빌더 패턴에 들어가자!

class Person {
  constructor(build) {
    if (build) {
      this.id = build.id;
      this.name = build.name;
      this.age = build.age;
    }
  }

  static get Build() {
    class Build {
      name(name) {
        this.name = name;
        return this;
      }
      age(age) {
        this.age = age;
        return this;
      }
      height(height) {
        this.height = height;
        return this;
      }
      build() {
        return new Person(this);
      }
    }
    return new Build();
  }
}

아래와 같이 사용할 수 있다.

const personBuilder1 = person.build;
const person1 = personBuilder1.name("tatiana").age(26);
const personBuilder2 = person.build;
const person2 = personBuilder2.name("James").age(50);

아직 깔끔하지 않다.
여기서 어제 배운 객체 지향 패러다임을 본다면 클래스란 개념이다.
빌더 역시 객체가 아닌 클래스 개념이다.
때문에 빌더가 상위 클래스가 되서 빌더가 되는 클래스에게 상속한다면
getter & setter의 중복도 제거하고, 클린 코드도 가능하다.
위와 같은 방법은 어떻게 해야할까?
다음 시간에 알아보도록 하겠다.

profile
Javascript(Typescript), JAVA(Kotlin), Python, Dart

0개의 댓글