PHpullh

PYTHON · 디자인패턴

빌더 패턴

빌더 패턴으로 복잡한 객체를 단계별로 구성합니다. 메서드 체이닝으로 가독성을 높입니다.

디자인패턴고급builder빌더메서드 체이닝생성 패턴

핵심 설명

빌더 패턴으로 복잡한 객체를 단계별로 구성합니다. 메서드 체이닝으로 가독성을 높입니다.

Python code

from dataclasses import dataclass, field

@dataclass
class HttpRequest:
    method: str = "GET"
    url: str = ""
    headers: dict = field(default_factory=dict)
    params: dict = field(default_factory=dict)
    body: str | None = None
    timeout: int = 30

class RequestBuilder:
    def __init__(self, url: str):
        self._request = HttpRequest(url=url)

    def method(self, method: str) -> "RequestBuilder":
        self._request.method = method
        return self

    def header(self, key: str, value: str) -> "RequestBuilder":
        self._request.headers[key] = value
        return self

    def param(self, key: str, value: str) -> "RequestBuilder":
        self._request.params[key] = value
        return self

    def body(self, data: str) -> "RequestBuilder":
        self._request.body = data
        return self

    def timeout(self, seconds: int) -> "RequestBuilder":
        self._request.timeout = seconds
        return self

    def build(self) -> HttpRequest:
        if not self._request.url:
            raise ValueError("URL은 필수입니다")
        return self._request

# 메서드 체이닝으로 가독성 높은 구성
request = (
    RequestBuilder("https://api.example.com/users")
    .method("POST")
    .header("Content-Type", "application/json")
    .header("Authorization", "Bearer token123")
    .param("page", "1")
    .body('{"name": "Alice"}')
    .timeout(10)
    .build()
)
print(f"{request.method} {request.url}")
print(f"헤더: {request.headers}")
print(f"본문: {request.body}")

학습 팁

빌더의 각 메서드가 self를 반환하면 메서드 체이닝이 가능합니다.

주의할 점

build()에서 필수 필드 유효성 검사를 하지 않으면 불완전한 객체가 생성될 수 있습니다.

자주 묻는 질문

빌더 패턴란 무엇인가요?

빌더 패턴으로 복잡한 객체를 단계별로 구성합니다. 메서드 체이닝으로 가독성을 높입니다.

빌더 패턴 학습 시 주의할 점은 무엇인가요?

build() 에서 필수 필드 유효성 검사를 하지 않으면 불완전한 객체가 생성될 수 있습니다.