Builder Pattern
빌더 패턴은 creational design pattern의 일종으로 복잡한 객체를 유연하게 생성할 수 있는 방법을 제공한다.
먼저 빌더 패턴을 적용한 객체의 생성을 코드로 정리한다.
public class Car {
private String brand;
private String model;
private int year;
// 생성자의 접근 권한을 private으로 제한하여, Builder에서만 접근할 수 있도록 한다.
private Car(Builder builder){
this.brand = builder.brand;
this.model = builder.model;
this.year = builder.year;
}
// Builder class를 static nested class로 생성한다.
public static class CarBuilder {
private String brand;
private String model;
private int year;
public CarBuilder setBrand(String brand) {
this.brand = brand;
return this;
}
public CarBuilder setModel(String model) {
this.model = model;
return this;
}
public CarBuilder setYear(int year) {
this.year = year;
return this;
}
//
public Car build() {
// 현재 builder 객체를 이용해 생성자를 호출
return new Car(this);
}
}
}
// Car class의 객체를 손쉽게 생성할 수 있다.
Car myCar = Car.CarBuilder()
.setBrand("Hyundai")
.setModel("mola")
.setYear(2023)
.build();
객체의 구성과 객체의 표현을 분리하여 같은 구성 과정을 통해 다른 객체의 표현을 만드는 것을 목적으로 빌더 패턴을 사용한다.
빌더 패턴을 사용함으로써 코드를 봤을때, 코드의 의미가 더 명료하게 보이고 읽기 쉬워지는 장점을 얻을 수 있음을 확인할 수 있다.
또한 class의 Builder에게만 생성자에 대한 접근 권한을 부여함으로써 객체의 불변성을 강화할 수 있다. (한 번 생성한 Car 객체의 내부 필드를 변경할 수 없음) → 여전히 class에 setter를 만들 필요가 없다는 것 또한 큰 장점이다.
public static class CarBuilder {
private String brand;
private String model;
private int year;
// Builder의 생성자를 통해 required field 지정도 가능
public CarBuilder(String brand, String model){
this.brand = brand;
this.model = model;
}
public CarBuilder setYear(int year) {
this.year = year;
return this;
}
//
public Car build() {
// 현재 builder 객체를 이용해 생성자를 호출
return new Car(this);
}
}
Car myCar = Car.CarBuilder("Hyundai", "grandure")
.setYear(2023)
.build();
위와 같이 Builder class의 생성자를 작성하는 방식을 통해 class 객체가 필수적으로 가져야 하는 field에 대해서는 Builder level에서 setting을 강제하는 설정 또한 가능하다.
이러한 빌더 패턴은 많은 optional or mutable attributes를 갖는 객체를 다루는 상황에서 특히 유용하고, 한 단계씩 객체를 생성할 수 있다는 것이 큰 장점으로 다가온다.
뿐만 아니라 코드의 재사용성과 가독성을 높이고 생성 과정을 더 유연하고 유지보수에 유리하게 만들어주기 때문에, 유용한 creational design pattern이라고 정리할 수 있을 것 같다.
참조
ChatGPT
https://readystory.tistory.com/121
'TIL(Today I Learned)' 카테고리의 다른 글
ApplicationRunner interface에 대한 정리 (2) | 2023.06.08 |
---|---|
Spring-Boot multi-module setting (0) | 2023.05.23 |
[Java] 지난주 공부한 개념들 기록과 용어 정리를 해보자. (0) | 2023.03.13 |
JWT를 이용한 인증, 인가 구현 과정 기록 (0) | 2023.03.02 |
Spring Security를 이용한 비밀번호 암호화 로직 구현 과정 기록 (0) | 2023.02.28 |
댓글