본문 바로가기
TIL(Today I Learned)

Builder Pattern (빌더 패턴)

by kkkdh 2023. 5. 18.
728x90

Builder Pattern

빌더 패턴은 creational design pattern의 일종으로 복잡한 객체를 유연하게 생성할 수 있는 방법을 제공한다.

https://refactoring.guru/design-patterns/builder

 

먼저 빌더 패턴을 적용한 객체의 생성을 코드로 정리한다.

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을 강제하는 설정 또한 가능하다.

https://refactoring.guru/design-patterns/builder

이러한 빌더 패턴은 많은 optional or mutable attributes를 갖는 객체를 다루는 상황에서 특히 유용하고, 한 단계씩 객체를 생성할 수 있다는 것이 큰 장점으로 다가온다.

 

뿐만 아니라 코드의 재사용성가독성을 높이고 생성 과정을 더 유연하고 유지보수에 유리하게 만들어주기 때문에, 유용한 creational design pattern이라고 정리할 수 있을 것 같다.


참조

ChatGPT

https://readystory.tistory.com/121

 

[생성 패턴] 빌더 패턴(Builder pattern) 이해 및 예제

빌더 패턴은 복잡한 객체를 생성하는 방법을 정의하는 클래스와 표현하는 방법을 정의하는 클래스를 별도로 분리하여, 서로 다른 표현이라도 이를 생성할 수 있는 동일한 절차를 제공하는 패턴

readystory.tistory.com

 

728x90

댓글