점층적 생성자 패턴(Telescoping Constructor Pattern) & 자바 빈즈(Java Beans) & 빌더 패턴(Builder Pattern)
생각보다 개념이 어렵지 않다.
# 점층적 생성자 패턴 (Telescoping Constructor Pattern)
생성자를 매개변수의 개수에 따라 여러개를 생성하는 방법
생성자를 포함하는 매개변수를 하나씩 들려가며 여러개 생성
ex) 필수 변수 1개, 선택 변수 3개인 클래스의 경우
생성자(필수)
생성자(필수, 선택1)
생성자(필수, 선택1, 선택2)
생성자(필수, 선택1, 선택2, 선택3)
이렇게 4개를 생성함
# 자바 빈즈 (Java Beans)
매개변수를 갖지 않는 생성자로 객체를 생성하고 setter 메소드를 통해 멤버필드의 변수들의 값을 설정하는 방법
- 인스턴스를 만들기 쉽고 가독성이 좋아진다. (점층적 생성자에 비해)
but
- 객체 1개 생성하기 위해 호출해야하는 메소드의 개수가 많다.
- 불변 클래스를 생성할 수 없다.
불변 : 객체 생성 후 멤버필드의 변수의 값을 바꾸지 못하는 것
- 일관성이 무너질 수 있다.
일관성 :
자바 빈즈를 사용하면 멤버필드의 각 변수들을 setter 메소드로 할당한다.
변수가 5개면 5번의 setter 메소드 호출이 필요한데, 이가 제대로 처리된다는 보장이 없다.
결국 객체의 한 멤버 변수는 null일 수 있기 때문에 안정성이 떨어지게 된다.
# 빌더 패턴 (Builder Pattern)
필수 변수는 생성자의 매개변수로 받아주고 선택 변수들은 Builder 클래스가 제공하는 setter 메소드로 성정하고 build() 메소드를 통해 객체를 생성한다.
- 점층적 생성자 패턴의 안정성 + 자바 빈즈 패턴의 가독성- 일반적으로 Builder는 생성할 클래스 내에 정적 멤버 클래스로 구현해준다.- 계층적으로 설계된 클래스와 사용하기 좋다.
- 점층적 생성자보다는 코드가 길기 때문에 매개변수가 4개 이상할 때 효과적이다.
아래는 빌더 패턴을 적용한 클래스이다.
public class User {
private final String name; // 필수
private int age; // 이하 선택
private String phone;
private String address;
private String job;
// 생성할 클래스의 정적 멤버 클래스로 빌더 생성
public static class Builder {
private final String name; // 필수
private int age = 0; // 이하 선택
private String phone = "";
private String address = "";
private String job = "";
private Builder(String name) {
this.name = name;
}
// 이하 Builder의 setter 메소드
public Builder setAge(int age) {
this.age = age;
return this;
}
public Builder setPhone(String phone) {
this.phone = phone;
return this;
}
public Builder setAddress(String address) {
this.address = address;
return this;
}
public Builder setJob(String job) {
this.job = job;
return this;
}
// 이하 build() 메소드
public User build() {
User user = new User();
user.age = this.age;
user.phone = this.phone;
user.address = this.address;
user.job = this.job;
return user;
}
}
}
아래는 객체 생성 방법이다.
User user = new User.Builder("김이름")
.setAge(26)
.setPhone("010-1234-5678")
.setAddress("서울시 송파구")
.setJob("개발자")
.build();