빌더 패턴 ( Builder Pattern )
정척 팩터리 메서드와 생성자를 이용한 객체 생성 방식의 문제점
정적 팩터리 메서드를 이용해 객체 생성, 생성자를 이용한 객체 생성 방식에는 큰 문제가 하나있다.
어떤 객체는 상황에따라 받는 매개 변수의 형태가 다른 객체가 있을 수 있다.
public class Some {
private boolean value1;
private boolean value2;
private String value;
public Some(String value) {
this.value = value;
}
public Some(boolean value1, boolean value2) {
this.value1 = value1;
this.value2 = value2;
}
public Some(boolean value1, boolean value2, String value) {
this.value = value;
this.value1 = value1;
this.value2 = value2;
}
public Some(String value, boolean value1) {
this.value = value;
this.value1 = value1;
}
}
매개 변수 갯수가 적다면 어찌어찌 대응은 하겠지만 매개 변수가 늘어나면 가독성과 유지보수가 힘들어지고 코드를 관리하기가 어려울 것이다.
자바 빈즈 패턴 ( Java Beans Pattern )
위 문제는 자바 빈즈 패턴을 이용하여 어느정도 해결 할 수 있다.
자비 빈즈 패턴이란 필드값을 변환해주는 setter 메서드를 만들어 필요한 객체의 필요한 값을 채워주는 방법이다.
public class Some {
private boolean value1;
private boolean value2;
private String value;
public void setValue1(boolean value1) {
this.value1 = value1;
}
public void setValue2(boolean value2) {
this.value2 = value2;
}
public void setValue(String value) {
this.value = value;
}
}
public class Main {
public static void main(String[] args) {
Some some = new Some();
some.setValue("value");
some.setValue1(true);
some.setValue2(false);
}
}
하지만 자바 빈즈 패턴에서도 문제점이 있는데 하나의 객체를 만들려면 여러개의 메서드를 호출해야하고 객체가 완성되기까지 일관성을 유지 하기 힘들며 세터 메서드로 언제든지 값을 변경 할 수 있기때문에 해당 객체가 불변값이라는걸 보증하기가 어렵다.
빌더 패턴 ( Builder Pattern )
빌더 패턴은 클라이언트가 필요한 객체를 직접 만드는 대신 필수 매개변수만으로 생성자 또는 정적 팩터리를 호출해 빌더 객체를 얻은다음 빌더 객체가 제공하는 일종의 세터 메서들로 원하는 매개변수들의 값을 설정후 최종적으로 매개변수가 없는 build 메서드를 호출해 필요한 객체를 얻는 방식이다.
public class Some {
private boolean value1;
private boolean value2;
private String value;
private Some(Builder builder) {
this.value = builder.value;
this.value1 = builder.value1;
this.value2 = builder.value2;
}
public static class Builder {
private String value = ""; // 필수 값
private boolean value1 = false;
private boolean value2 = false;
public Builder(String value) {
this.value = value;
}
public Builder value1(boolean value1) {
this.value1 = value1;
return this;
}
public Builder value2(boolean value2) {
this.value2 = value2;
return this;
}
public Some build() {
return new Some(this);
}
}
}
public class Main {
public static void main(String[] args) {
Some some = new Some.Builder("HI").value1(true).value2(false).build();
}
}
빌더 패턴의 메서드들은 this 자기 자신을 반환하기 때문에 세터 메서드들을 연속적으로 호출 할 수 있고 이런식으로 객체를 생성하면 일관성을 유지하며 불변값을 보증 할 수 있다.
빌더 패턴이 매우 유용해도 단점은 존재하는데 일단 객체를 빌더 패턴으로 생성할거면 빌더부터 만들어야하며, 빌더 생성 비용이 크지는 않지만 성능에 민감한 상황에서는 문제가 될 수 있고 객체 매개변수가 적은 상황에서는 빌더 패턴을 쓰는게 낭비라고 생각한다.
'book review > Effective java' 카테고리의 다른 글
[Effective Java] Item 6. 불필요한 객체 생성을 피하라 (0) | 2024.02.06 |
---|---|
[Effective Java] Item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라. (0) | 2024.02.05 |
[Effective Java] Item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라 (0) | 2024.02.02 |
[Effective Java] Item 3. 생성자나 열거 타입으로 싱글턴임을 보증하라 (1) | 2024.02.01 |
[Effective Java] Item 1. 생성자 대신 정적 팩터리 메서드를 고려하라 (0) | 2024.01.31 |