빌더 패턴(Builder Pattern)
은 객체 생성 디자인 패턴 중 하나로, 복잡한 객체의 생성 과정을 단계적으로 처리
할 수 있도록 도와줍니다.
이 패턴을 사용하면 객체의 내부 구조나 생성 과정이 복잡하더라도, 사용자는 해당 복잡성을 신경 쓰지 않고 단순하게 객체를 생성할 수 있습니다.
특히 생성자가 복잡하거나, 생성자 오버로딩을 사용하기 어려운 경우에 매우 유용한 디자인 패턴입니다.
객체의 일부 속성만 설정
`하고 싶거나, 특정 순서
로 생성 과정을 관리하고 싶은 경우 유용합니다.
객체 생성 시 가독성을 높여 코드의 이해도를 높입니다. 필수적이지 않은 옵션을 다룰 때 코드가 훨씬 깔끔해집니다.
설정하지 않는 필드는 null값이 필요하므로 기본형대신 래퍼형으로 사용(int -> Integer)
public class Person {
private Integer id;
private String name;
private Integer age;
private String email;
private Person() {}
public static Person builder() {
return new Person();
}
public Person id(Integer id) { //만약 리턴 타입이 void라면 그냥 setter다.
this.id = id;
return this; //heap 영역에서 자기 자신의 객체를 this라고 지칭한다.
}
public Person name(String name) {
this.name = name;
return this;
}
public Person age(Integer age) {
this.age = age;
return this;
}
public Person email(String email) {
this.email = email;
return this;
}
public Integer getId() {
return id;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
public String getEmail() {
return email;
}
}
public class App {
public static void main(String[] args) {
Person p1 = Person.builder().id(1).name("홍길동").age(20).email("dong@nate.com");
//이름과 이메일만 넣고 싶다.
Person p2 = Person.builder().name("홍길동").email("dong@nate.com");
}
}
빌더 패턴
vs 생성자
생성자는 매개변수(파라미터)의 순서를 알고 있어야 한다.
id, 이름, 나이, 메일 이렇게 알고 적어 넣어야 하고 헷갈릴 수도 있다.
하지만 빌더 패턴은 OO.builder().id(A).name(B).age(C).email(D)
이런 식으로 무엇을 적어 넣어야 할지 메서드 이름으로 명확하게 파악할 수 있다.
생성자는 무언가를 넣고 싶지 않다면 멤버 변수를 제외한 생성자를 새로 만들어야 한다.
즉 생성자 오버로딩을 해야한다.
하지만 빌더 패턴은 id와 나이를 빼고 싶으면 그냥 OO.builder().name(B).email(D)
이렇게 해주면 된다.
Share article