빌더패턴 (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처럼 동적으로 필드를 설정할 수 있는 언어에서도, 명시적이고 단계적인 객체 구성을 원할 때 빌더 패턴은 훌륭한 선택이 될 수 있습니다.
'Programming > Design pattern' 카테고리의 다른 글
[Design pattern] 브릿지 패턴(Bridge) 패턴 (10) | 2025.07.02 |
---|---|
[Design pattern] 어댑터(Adapter) 패턴 (10) | 2025.06.30 |
[Design pattern] 프로토타입(Prototype) 패턴 (8) | 2025.06.28 |
[Design pattern] 팩토리(Factory) 패턴 (5) | 2025.06.26 |
[Design pattern] 싱글톤(Singleton) 패턴 (10) | 2025.06.25 |