복잡한 객체를 생성하는 클래스와 표현하는 클래스를 분리하여,
동일한 절차에서도 서로 다른 표션을 생성하는 방법을 제공하는
패턴.
@Getter
public class Person{
private String name; //이름
private Integer age; //나이
private String tel; //전화번호
private String email; //이메일
public Person(){}
}
Person이라는 클래스가 있다.
해당 클래스가 가진 멤버 변수를 초기화하면서 생성한다고 가정해보자.
public Person(String name , Integer age , String tel , String email){
this.name = name;
this.age = age;
this.tel = tel;
this.email = email;
}
//이러한 생성자가 필요할 것이다.
String name = "홍길동";
String age = 10;
String tel = "000-0000-0000";
String email = "dflksdjf@dsaflkj.net"
Person person = new Person(name , age , tel , email);
//생성 코드
특정 필드만 초기화하여 사용하고자 할 때마다 생성자가 필요하다.
데이터의 순서를 맟춰서 주입해줘야 한다.
가독성 측면에서 좋지 못하다.
Setter메소드를 이용하면 특정 필드만 초기화하여 사용할 수 있다.
뿐만 아니라 , 어느 필드에 값이 들어갔는지 명확하게 알 수 있다.
Person person = new Person();
person.setName("홍길동");
person.setAge(10);
한번 값이 주입되고 나서 , 변경될 일이 없는 데이터도
변경될 수 있다.
초기화할 필드만큼 setter를 호출 해야 한다.
Person을 Builder패턴을 적용하여 구현 해보자.
public class Person{
private String name;
private Integer age;
private String tel;
private String email;
//생성자.
public Person(String name , Integer age , String tel , String email){
this.name = name;
this.age = age;
this.tel = tel;
this.email = email;
}
//PersonBuilder 반환.
public static Person.PersonBuilder builder() {
return new Person.PersonBuilder();
}
//내부 클래스 Builder 클래스 사용
public static class PersonBuilder{
private String name;
private Integer age;
private String tel;
private String email;
PersonBuilder(){}
public Person.PersonBuilder name(final String name){
this.name = name;
return this;
}
public Person.PersonBuilder age(final int age){
this.age =age;
}
public Person.PersonBuilder tel(final String tel){
this.tel =tel;
}
public Person.PersonBuilder email(final String email){
this.email =email;
}
public Person build(){
return new Person(this.name , this.age , this.tel , this.email);
}
}
}
Person person = Person.builder()
.name("홍길동")
.age(10)
.build();
어떤 값이 주입되었는지 한눈에 파악이 가능하며,
한번의 호출로 객체를 생성해서 이전 JavaBean 패턴의 단점을 보완한다.
생성자처럼 파라미터의 순서를 지킬 필요가 없다.
마지막에 build라는 메서드가 생성자의 순서에 알아서 주입
주는 덕이다.
생성자를 매번 생성해줄 필요가 없다.
불변성을 확보할 수 있다.