Builder 패턴은 객체 생성과정과 표현 방법을 분리하여 동일한 생성 과정에서 서로 다른 표현 결과를 만들 수 있는 디자인 패턴입니다. 주로 복잡한 객체를 생성할 때 사용됩니다.
Java에서의 Builder 패턴은 특히 복잡한 생성자 인수가 많을 때, 또는 대부분의 인수가 선택적일 때 사용되는데, 이를 통해 가독성과 코드의 유지 관리를 향상시킬 수 있습니다.
public class SomeClass {
private final int requiredParam;
private final int optionalParam1;
private final int optionalParam2;
public static class Builder {
// 필수 매개변수
private final int requiredParam;
// 선택적 매개변수 - 기본값으로 초기화
private int optionalParam1 = 0;
private int optionalParam2 = 0;
public Builder(int requiredParam) {
this.requiredParam = requiredParam;
}
public Builder optionalParam1(int value) {
optionalParam1 = value;
return this;
}
public Builder optionalParam2(int value) {
optionalParam2 = value;
return this;
}
public SomeClass build() {
return new SomeClass(this);
}
}
private SomeClass(Builder builder) {
requiredParam = builder.requiredParam;
optionalParam1 = builder.optionalParam1;
optionalParam2 = builder.optionalParam2;
}
}
이렇게 구성된 Builder 패턴은 다음과 같이 사용할 수 있습니다.
SomeClass someClass = new SomeClass.Builder(123)
.optionalParam1(456)
.optionalParam2(789)
.build();
먼저 SomeClass 라는 클래스가 있습니다. 이 클래스는 몇 개의 필드를 가지고 있는데, 일부는 필수적이고, 일부는 선택적입니다.
그리고 이 클래스 안에 Builder 라는 정적 내부 클래스가 정의되어 있습니다. 이 Builder 클래스는 SomeClass의 필드와 똑같은 필드를 가지고 있으며, 필수 필드는 생성자에서 초기화하고, 선택적 필드는 메서드를 통해 초기화할 수 있습니다.
마지막으로, Builder 클래스는 build() 메서드를 가지고 있습니다. 이 메서드는 Builder 객체 자신의 필드를 이용해 SomeClass 객체를 생성합니다.
이렇게 만들어진 Builder 클래스를 이용하면, 필수적인 필드는 무조건 초기화하게 되어 안전성을 보장하면서, 선택적인 필드는 필요에 따라 초기화할 수 있게 됩니다. 또한, 어떤 필드가 어떤 값을 가지는지 명확히 알 수 있어서 코드의 가독성이 좋아집니다.