빌더 패턴은 객체 생성을 단순화하고 유연성을 높여주는 디자인 패턴입니다.
Builder 패턴 장점
- 가독성과 유지보수성 향상: 빌더를 사용하면 객체를 생성하는 코드가 명확해지고 가독성이 향상됩니다. 또한, 새로운 속성을 추가하거나 수정할 때에도 해당 빌더만 수정하면 되므로 유지보수성이 더 높아집니다.
- 선택적 매개변수 처리: 객체에 선택적으로 값을 설정해야 하는 경우 빌더 패턴은 편리합니다. 모든 매개변수를 단일 생성자에 전달하는 것보다 빌더를 통해 원하는 속성만 설정할 수 있기 때문입니다.
- 불변성과 불변 객체 생성: 빌더를 사용하면 불변 객체(Immutable Object)를 쉽게 생성할 수 있습니다. 불변 객체는 여러 스레드에서 안전하며, 객체의 상태가 변경되는 것을 방지하는데 도움을 줍니다.
Builder 패턴 단점
- 추가적인 코드 작성: 빌더 패턴을 구현하려면 별도의 빌더 클래스를 작성해야 합니다. 그러나 Spring 공식 라이브러리 처럼 사용하는 Lombok으로 해결할 수 있습니다.
코드로 보겠습니다.
package builder;
public class Car {
private String color;
private String battery;
private String wheels;
public static CarBuilder builder() {
return new CarBuilder();
}
public static class CarBuilder {
private String color;
private String battery;
private String wheels;
public CarBuilder color(String color) {
this.color = color;
return this;
}
public CarBuilder battery(String battery) {
this.battery = battery;
return this;
}
public CarBuilder wheels(String wheels) {
this.wheels = wheels;
return this;
}
public Car build() {
Car car = new Car();
car.color = this.color;
car.battery = this.battery;
car.wheels = this.wheels;
return car;
}
}
}
Car라는 인스턴스를 만들어주는 Builder입니다.
Car 클래스에는 builder() 라는 메서드가 있고, CarBuilder 인스턴스를 생성하여 반환하는 역할을 합니다.
CarBuilder는 각각의 필드값을 넣는 메서드가 있고, 그 메서드는 자신의 인스턴스 (this)를 반환합니다.
CarBuilder 인스턴스의 필드에 값을 입력했으면 build()라는 메서드로 Car 인스턴스를 생성합니다.
아래와 같이 Builder를 이용하여 car을 만들 수 있습니다.
public static void main(String[] args) {
Car.CarBuilder builder = Car.builder();
builder = builder.color("blue");
builder = builder.battery("200kwh");
builder = builder.wheels("22inch");
Car car = builder.build();
}
이것을 체이닝 방식으로 변경하면 아래와 같이 가독성 있게 작성할 수 있습니다.
public static void main(String[] args) {
Car car = Car.builder()
.color("blue")
.battery("200kwh")
.wheels("22inch").build();
}
감사합니다.
'Architecture' 카테고리의 다른 글
Kafka의 고가용성: 장애 대응 및 데이터 손실 방지 (0) | 2023.08.08 |
---|---|
DB 성능 저하 해결 전략: 스케일링, 리플리케이션, 샤딩 그리고 클러스터링 (1) | 2023.08.04 |
메시지 기반 아키텍처: 디커플링, 확장성, 높은 가용성 및 비동기 통신 (0) | 2023.08.01 |
자바 데코레이터 패턴과 람다 예외 처리: 코드 가독성을 높이는 방법 (0) | 2023.07.14 |
Sharding Storage + Spring + JPA (분산저장). 1부 (1) | 2023.03.25 |