Roel Notebook

[디자인패턴] 빌더 패턴 (Builder)

by Roel Downey
728x90
반응형

- 위키 : 빌더 패턴

 

복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴

 

Effective Java의 필더 패턴

이펙티브 자바에서 빌더 패턴으로 불변 클래스로 만들 수 있다. 

불변 클래스는 생성이 되면 상태를 변경하지 않는 객체를 만들 수 있다. 

모든 상태 정보는 객체가 생성 될 때 제공되며 객체의 수명 동안 변경되지 않는다.

 

링크 : 빌더 패턴

불변 클래스로 작성해야하는 이유

1. 불변 객체는 생성 된 상태인 하나의 상태에만 있을 수 있으므로 간단하고 사용하기 쉽다.

2. 본질적으로 스레드로 부터 안전하다. 즉, 동기화가 필요하지 않다.

3. 불변 클래스의 객체는 자유롭게 공유 할 수 있다. 

 

불변 클래스 만들기

두가지 방법이 있다.

첫 번째는 롬복을 활용해서 @Builder 애노테이션으로 쉽게 사용한다. 

두 번째는 직접 구현해서 활용한다.

 

첫 번째 방법은 롬복을 추가하고 클래스 위에 애노테이션을 주면 된다. 

 

두 번째 방법은 다음과 같이 해보자!

public class User {

  private final Email email;
  private String password;

  public User(Email email, String password) {
    this(email, password);
  }

  public User(Email email, String password) {
    this.email = email;
    this.password = password;
  }

    public Email getEmail() {
    return email;
  }

  public String getPassword() {
    return password;
  }

  static public class Builder {
    private Email email;
    private String password;

    public Builder() {
    }

    public Builder(User user) {
      this.email = user.email;
      this.password = user.password;
    }

    public Builder email(Email email) {
      this.email = email;
      return this;
    }

    public Builder password(String password) {
      this.password = password;
      return this;
    }
    
    public User build() {
      return new User(email, password);
    }
  }

}

 

 

이 패턴을 학습하면서 이런 생각을 하게 되었다.

필드 패턴을 사용하면 객체를 생성한 후, 변경 불가능 상태로 만드는데, 만약에 password를 수정하려고 하면 setter를 만들어줘야 한다고 생각했다. 그러면 코드가 더 길어지고 비효율 적인거 아닌가? 라는 생각을 하게 되었다.

2020/08/25 - [Web/review And comment] - [comment] 상태를 가지는 객체에 Getter Setter를 쓰지마라?!

-> 답 : 엔터티는 상태가 바뀔수 있다. 빌더 패턴을 가져가면 불변성과 네임드 파라미터를 가져갈 수 있다. 단순히 setter를 하지말고 의미있는 메소드로 처리하는게 좋다. (링크)

 

 

 

 

 

 

728x90
반응형

블로그의 정보

What doing?

Roel Downey

활동하기