직관적이다
생성자는 객체 생성을 위한 가장 기본적이고 직관적인 방법이며 클래스에 정의된 속성들을 초기화하는데 사용된다.
한정적이다
생성자는 인자의 수와 타입이 고정되어 있기 때문에 일부 선택적인 속성들에 대해 유연성이 떨어질 수 있다.
오버로딩을 통한 유연성
여러 생성자를 정의함으로써 다양한 방법으로 객체를 생성할 수 있지만 이 경우 생성자가 많아지면 코드 유지 관리가 어려워질 수 있다.
유연성
Builder 패턴은 객체를 생성할 때 더 많은 유연성을 제공한다.
선택적인 매개변수가 많은 경우에 유용하며, 필요에 따라 다양한 방식으로 객체를 구성할 수 있습니다.
가독성
Builder 패턴은 메소드 체이닝을 사용하여 코드의 가독성을 높입니다.
이를 통해 각 매개변수의 역할이 더 명확하게 드러나며, 어떤 값이 설정되었는지 명확하게 확인할 수 있다.
불변 객체
Builder 패턴을 사용하면 불변 객체를 쉽게 생성할 수 있다.
빌더를 통해 모든 필수 필드를 설정한 후 불변 객체를 생성할 수 있다.
// 생성자 방식
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
// Builder 패턴
public class User {
private String name;
private int age;
private User(Builder builder) {
this.name = builder.name;
this.age = builder.age;
}
public static class Builder {
private String name;
private int age;
public Builder setName(String name) {
this.name = name;
return this;
}
public Builder setAge(int age) {
this.age = age;
return this;
}
public User build() {
return new User(this);
}
}
}
// 사용 예
User user = new User.Builder()
.setName("Alice")
.setAge(30)
.build();
만약 Lombok의 @builder를 사용한다면?
아래처럼 간결하게 표현 가능하다.
import lombok.Builder;
@Builder
public class User {
private String name;
private int age;
}