Architecture

자바 빌더 패턴: 객체 생성

백엔드 유성 2023. 7. 22. 23:56

빌더 패턴은 객체 생성을 단순화하고 유연성을 높여주는 디자인 패턴입니다.

 

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();
    }

 

감사합니다.