빌더 패턴
- 객체의 생성을 가독성 있게 만들고, 여러 개의 매개변수를 갖는 생성자를 피하며, 선택적인 매개변수를 다루기 위해 사용되는 디자인 패턴
사용하는 이유
- 일반적으로 매개변수를 가진 생성자를 이용하기 위해서 매개변수의 순서를 기억하고 전달해야하는 불편함이 존재했음,
- 일부 매개변수가 선택적이여서 오버로드된 생성자를 많이 사용해야하는 문제가 있었음
- 매개변수 순서 기억할 필요없음, 선택적인 필드들을 다루기 쉬움, 가독성과 유지보수성 향상, 불변성 유지 가능
단점?
- 빌더 클래스를 따로 작성해야한다는 단점이 존재함
빌더 패턴 사용법
- 빌더 클래스 정의
- 생성하고자 하는 객체의 필드들을 멤버 변수로 가지는 빌더 클래스를 정의
- 빌더 메서드 정의
- 빌더 클래스는 필드들을 설정하는 메서들들을 구현
- 메서드들은 빌더 객체 자체를 반환하도록하여 메서드 체인으로 호출할 수 있게 만든다
- 빌더 객체의 빌드 메서드
- 빌더 클래스에서 설정한 필드들을 사용하여 실제 객체를 생성하는 빌드 메서드 구현
순수 자바로 구현한 빌더 패턴
public class Person {
private String name;
private int age;
private String address;
private Person() {
// private 생성자로 외부에서 직접 객체 생성을 막음
}
// 빌더 클래스 정의
public static class Builder {
private String name;
private int age;
private String address;
public Builder() {
// 빌더 클래스의 기본 생성자
}
public Builder name(String name) {
this.name = name;
return this;
}
public Builder age(int age) {
this.age = age;
return this;
}
public Builder address(String address) {
this.address = address;
return this;
}
public Person build() {
Person person = new Person();
person.name = this.name;
person.age = this.age;
person.address = this.address;
return person;
}
}
// getter 메서드들 생략 (필요한 경우 추가 가능)
}
// 사용 예시
public class Main {
public static void main(String[] args) {
// 빌더 패턴을 사용하여 객체 생성
Person person = new Person.Builder()
.name("John")
.age(30)
.address("New York")
.build();
System.out.println(person.getName()); // John
System.out.println(person.getAge()); // 30
System.out.println(person.getAddress()); // New York
}
}
롬복(Lombok) 라이브러리로 생성한 빌더 패턴
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
public class Person {
private String name;
private int age;
private String address;
}
// 사용 예시
public class Main {
public static void main(String[] args) {
Person person = Person.builder()
.name("John")
.age(30)
.address("New York")
.build();
System.out.println(person.getName()); // John
System.out.println(person.getAge()); // 30
System.out.println(person.getAddress()); // New York
}
}