자바 디자인 패턴

*7. Builder - 복잡한 인스턴스를 조립한다

조요피 2023. 10. 10. 09:15

7. Builder - 복잡한 인스턴스를 조립한다

Builder 디자인 패턴은 객체를 생성하는 복잡한 과정을 캡슐화하고, 객체의 다양한 구성 옵션을 설정하기 위한 패턴 중 하나입니다. 이 패턴은 Java와 같은 객체 지향 프로그래밍 언어에서 매우 유용하며, 객체의
가독성과 유지보수성을 향상시킬 수 있습니다.

Builder 디자인 패턴을 구현하려면 다음과 같은 주요 구성 요소가 필요합니다:

  1. 대상 객체 (Target Object): 빌더 패턴을 사용하여 생성하려는 복잡한 객체를 나타냅니다. 이 객체는 일반적으로 많은 설정 옵션을 가지고 있습니다.

  2. 빌더 인터페이스 (Builder Interface): 대상 객체를 생성하는 데 필요한 메서드를 정의하는 인터페이스입니다. 이 인터페이스는 객체를 구성하는 다양한 메서드를 선언하며, 이 메서드들은 빌더 패턴을
    구현하는 다른 클래스에서 구체적으로 구현됩니다.

  3. 구체적인 빌더 클래스 (Concrete Builder): 빌더 인터페이스를 구현하는 클래스입니다. 이 클래스는 대상 객체를 구성하는 데 필요한 메서드를 제공하며, 메서드 체이닝을 통해 다양한 설정 옵션을
    연속적으로 적용할 수 있도록 합니다.

  4. 디렉터 클래스 (Director): 빌더 클래스를 사용하여 대상 객체를 생성하는 클래스입니다. 이 클래스는 빌더 클래스를 인스턴스화하고, 설정 메서드를 호출하여 객체를 생성하고 반환합니다.

다음은 Java에서 Builder 디자인 패턴을 구현하는 간단한 예제입니다. 이 예제에서는 자동차 객체를 생성하는 데 빌더 패턴을 사용합니다:

// 대상 객체: 자동차
public class Car {
    private String make;
    private String model;
    private int year;

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

    // Getter 메서드들
}

// 빌더 인터페이스
public interface CarBuilder {
    CarBuilder setMake(String make);

    CarBuilder setModel(String model);

    CarBuilder setYear(int year);

    Car build();
}

// 구체적인 빌더 클래스
public class CarBuilderImpl implements CarBuilder {
    private String make;
    private String model;
    private int year;

    @Override
    public CarBuilder setMake(String make) {
        this.make = make;
        return this;
    }

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

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

    @Override
    public Car build() {
        return new Car(make, model, year);
    }
}

// 디렉터 클래스
public class CarDirector {
    public Car constructSportsCar() {
        return new CarBuilderImpl()
                .setMake("Porsche")
                .setModel("911")
                .setYear(2023)
                .build();
    }

    public Car constructSUV() {
        return new CarBuilderImpl()
                .setMake("Toyota")
                .setModel("RAV4")
                .setYear(2023)
                .build();
    }
}

위의 예제에서 CarDirector 클래스는 CarBuilder를 사용하여 다양한 유형의 자동차 객체를 생성할 수 있습니다. 이를 통해 객체를 구성하는 과정을 더 명확하게 표현하고, 객체 생성 코드를 간결하게
관리할 수 있습니다.