빌더패턴 (Builder Pattern)

앞선 단원에서 정적 팩토리 메소드를 배웠습니다.

하지만, 클래스 내에 멤버변수가 여러 개 일 때를 생각해봅시다. 생성자나 정적팩토리메소드로 받아야 할 파라미터 수가 많아지면서 관리가 힘들어집니다. 만약 타입이 같은 변수가 이웃하여 붙어있으면, 혼동이 생기기도 하고 심지어는 개발자가 이를 구분하지 못해 버그가 만들어질 수 있습니다.

이를 더 깔끔하게 정돈하면서 객체를 선언하는 방법은 없을까요?

빌더패턴은 이를 가능하게 합니다.

우리가 배웠던 static 제어자를 통해서 빌드 패턴을 정의해 보겠습니다.

먼저 Car 클래스를 정의해봅시다.

public class Car {
    private String brand;
    private String model;
    private int year;

    // 기본 생성자
    public Car() {
    }

    // 매개변수를 받는 생성자
    public Car(String brand, String model, int year) {
        this.brand = brand;
        this.model = model;
        this.year = year;
    }
}

이렇게 생성자를 사용하면 객체를 생성할 때 필요한 정보를 인스턴스 변수에 설정할 수 있습니다. 그러나 생성자의 매개변수가 많아지면 인자의 순서를 혼동할 수 있고, 특정 매개변수를 생략하기 어렵습니다.

빌더 패턴 (Builder Pattern)

빌더 패턴은 객체를 생성하는 복잡한 과정을 추상화하고, 사용자가 명확하게 이해할 수 있는 방식으로 객체를 구축하는 패턴입니다.

public class Car {
    private String brand;
    private String model;
    private int year;

    public Car() {
    }

    public Car(String brand, String model, int year) {
        this.brand = brand;
        this.model = model;
        this.year = year;
    }

    public static CarBuilder builder() {
        return new CarBuilder();
    }

    public static class CarBuilder {
        private String brand;
        private String model;
        private int year;

        CarBuilder() {
        }

        public CarBuilder brand(String brand) {
            this.brand = brand;
            return this;
        }

        public CarBuilder model(String model) {
            this.model = model;
            return this;
        }

        public CarBuilder year(int year) {
            this.year = year;
            return this;
        }

        public Car build() {
            return new Car(this.brand, this.model, this.year);
        }

        public String toString() {
            return "Car.CarBuilder(brand=" + this.brand + ", model=" + this.model + ", year=" + this.year + ")";
        }
    }
}

빌더 클래스(CarBuilder)는 필요한 매개변수를 하나씩 설정할 수 있는 메서드를 제공합니다. 각 메서드는 빌더 자체를 반환하므로 메서드 체이닝을 통해 여러 값을 설정할 수 있습니다. 마지막으로 build 메서드를 호출하여 실제 객체(Car)를 생성합니다.

빌더 패턴 사용 예시

public class Main {
    public static void main(String[] args) {
        // 빌더 패턴을 사용한 객체 생성
        Car car1 = Car.builder()
            .brand("Toyota")
            .model("Camry")
            .year(2022)
            .build();
    }
}

빌더 패턴으로 위와 같이 조금 더 깔끔한 형태로 객체를 생성할 수 있습니다.

Last updated