Builder 패턴은 객체 생성 패턴 중 하나로, 객체의 생성 과정에서 복잡한 설정이나 여러 단계의 초기화가 필요한 경우 유용하게 사용됩니다. 이 패턴은 객체를 구성하는 부분들을 단계별로 설정할 수 있게 하며, 최종적으로 완성된 객체를 생성합니다. Builder 패턴은 특히 불변 객체(immutable object)를 생성할 때 많이 사용됩니다.
1. 주요 목적
Builder 패턴의 주요 목적은 객체 생성의 복잡성을 줄이고, 객체를 더 유연하게 구성할 수 있게 하는 것입니다. 이를 통해 객체를 생성하는 과정에서 발생할 수 있는 다양한 문제를 피하고, 생성된 객체가 일관된 상태를 가지도록 보장할 수 있습니다.
2. 구성 요소
Builder 패턴은 일반적으로 다음과 같은 구성 요소로 이루어집니다.
- Product (제품): 최종적으로 생성될 복잡한 객체입니다. 예를 들어, 컴퓨터나 자동차와 같은 복잡한 객체가 될 수 있습니다.
- Builder (건설자):
Product
객체를 생성하는 데 필요한 인터페이스(또는 추상 클래스)입니다. Builder는 Product 객체의 각 구성 요소를 설정하는 메서드를 정의합니다.
- ConcreteBuilder (구체적 건설자):
Builder
인터페이스를 구현하는 클래스입니다. 이 클래스는Product
객체의 인스턴스를 만들고, 각 구성 요소를 설정하는 메서드를 정의합니다. 최종적으로getResult()
메서드를 통해 완성된 객체를 반환합니다.
- Director (감독자):
Builder
객체를 이용해Product
객체의 생성 과정을 지시하는 클래스입니다.Director
는 Builder에게 각 단계의 작업을 지시하고, 최종적으로 완성된 객체를 반환받습니다. 이 단계에서 Director는 복잡한 생성 과정의 제어를 담당합니다.
3. Builder 패턴의 구현 예제
다음은 간단한 예제로, 컴퓨터(Computer) 객체를 Builder 패턴을 사용해 생성하는 경우를 보여줍니다.
// 1. Product 클래스
public class Computer {
private String CPU;
private String GPU;
private int RAM;
private int storage;
// 생성자와 Getter는 생략
private Computer(Builder builder) {
this.CPU = builder.CPU;
this.GPU = builder.GPU;
this.RAM = builder.RAM;
this.storage = builder.storage;
}
public static class Builder {
private String CPU;
private String GPU;
private int RAM;
private int storage;
public Builder setCPU(String CPU) {
this.CPU = CPU;
return this;
}
public Builder setGPU(String GPU) {
this.GPU = GPU;
return this;
}
public Builder setRAM(int RAM) {
this.RAM = RAM;
return this;
}
public Builder setStorage(int storage) {
this.storage = storage;
return this;
}
public Computer build() {
return new Computer(this);
}
}
}
4. 사용 예시
public class Main {
public static void main(String[] args) {
Computer myComputer = new Computer.Builder()
.setCPU("Intel i7")
.setGPU("NVIDIA GTX 3080")
.setRAM(16)
.setStorage(512)
.build();
// myComputer 객체 사용
}
}
5. 장점
- 복잡한 객체의 생성 과정 제어: 복잡한 객체를 단계별로 생성할 수 있으며, 생성 과정에서의 실수를 줄일 수 있습니다.
- 유연성: 객체 생성 과정에서 필요한 파라미터만 설정할 수 있고, 나머지는 기본값으로 처리할 수 있습니다.
- 가독성 향상: 코드가 더 읽기 쉽고 유지보수하기 쉬워집니다.
6. 단점
- 복잡성 증가: 단순한 객체에 대해 Builder 패턴을 적용하면 불필요하게 복잡해질 수 있습니다.
- 객체가 많이 필요 없는 경우 과도: 객체가 단순하거나 생성이 자주 일어나지 않는 경우에는 오히려 Builder 패턴이 불필요할 수 있습니다.
Builder 패턴은 특히 객체 생성에 많은 파라미터가 필요하거나, 다양한 설정을 통해 객체를 유연하게 구성하고자 할 때 매우 유용합니다.
Share article