본문 바로가기

Programming/Design pattern

[Design pattern] 빌더(Builder) 패턴

파이썬로고

 

빌더패턴 (Builder Pattern)

빌더(Builder) 패턴은 복잡한 객체의 생성 과정을 단계별로 나누어 객체 생성의 유연성과 가독성을 높이는 생성(Creational) 디자인 패턴입니다. 말그대로 조립하듯이 객체를 생성하는 구조입니다.

빌더패턴은 아래와 같은 경우에 사용합니다.

 

  • 생성자 인자가 많을 때
  • 생성자 오버로딩이 불가능한 언어(Python 포함)에서는 조건별 생성이 불편
  • 특정 필드만 선택적으로 설정하고 싶을 때 유용
  • 메소드 체이닝(method chaining) 방식으로 직관적인 코드 작성 가능

 

 

빌더패턴 예제

class User:
    def __init__(self, username, email=None, age=None, phone=None, address=None):
        self.username = username
        self.email = email
        self.age = age
        self.phone = phone
        self.address = address

    def __str__(self):
        return f"User({self.username}, {self.email}, {self.age}, {self.phone}, {self.address})"

사용자의 정보를 담고있는 User 클래스 입니다. 이름,이메일,나이,휴대전화번호,주소를 필드고 가지고 있는데, 필드가 많아질수록 __init__ 함수가 복잡해지고,  선택적 인자 설정도 복잡합니다.

class UserBuilder:
    def __init__(self, username):
        self._username = username
        self._email = None
        self._age = None
        self._phone = None
        self._address = None

    def set_email(self, email):
        self._email = email
        return self

    def set_age(self, age):
        self._age = age
        return self

    def set_phone(self, phone):
        self._phone = phone
        return self

    def set_address(self, address):
        self._address = address
        return self

    def build(self):
        return User(
            username=self._username,
            email=self._email,
            age=self._age,
            phone=self._phone,
            address=self._address
        )

빌더를 도입하여 클래스를 구현한 형태입니다. 각 설정자는 self를 반환하여 메소드체이닝이 가능하도록 구현되어있고, build() 함수는 입력 받은 매개변수로 User 객체를 생성하여 리턴하게 됩니다.

user = (
    UserBuilder("John")
    .set_email("jinsu@example.com")
    .set_age(30)
    .set_address("Daejeon, South Korea")
    .build()
)

print(user)
# 출력: User(John, test@example.com, 30, None, Daejeon, South Korea)

위와 같은 형태로 객체를 생성합니다. 필수 값(username)만 초기화 시점에 받고 나머지는 선택적으로 설정할 수 있습니다.

이러한 패턴으로 구현하면 가독성이 높고 어떤 값을 설정했는지 직관적으로 확인이 가능합니다.

 

빌더 패턴은 생성자의 복잡도를 낮추고, 유연하고 직관적인 객체 생성 방식을 제공합니다.
특히 Python처럼 동적으로 필드를 설정할 수 있는 언어에서도, 명시적이고 단계적인 객체 구성을 원할 때 빌더 패턴은 훌륭한 선택이 될 수 있습니다.