디자인패턴 - Builder

code_able·5일 전
0

Builder 패턴이란

복잡한 객체를 단계적으로 생성하는 방법을 제공하는 생성 패턴입니다. 이 패턴은 객체 생성 과정에서의 세부 설정이나 조립이 필요한 경우에 유용하며, 다양한 속성들을 선택적으로 설정하여 객체를 만들 수 있게 합니다. 특히, 복잡한 객체 생성 시 코드를 더 읽기 쉽게 만들고, 유연성을 높이며, 객체 생성의 과정과 표현을 분리하는 데 중점을 둡니다.

빌더 패턴을 사용하는 이유

  • 객체 생성 과정의 복잡도 감소: 복잡한 객체의 생성 과정이 빌더 클래스로 분리되어, 가독성과 유지보수가 쉬워집니다.
  • 유연한 객체 구성: 선택적인 속성들을 가질 수 있으며, 필요한 속성만 설정하여 객체를 생성할 수 있습니다.
  • 변경 용이성: 빌더 클래스를 수정하여 다양한 객체 구성을 쉽게 추가할 수 있습니다.

빌더 패턴의 구조

  • Builder (빌더): 객체를 단계별로 생성하는 인터페이스나 추상 클래스를 정의합니다.
  • Concrete Builder (구체 빌더): 빌더 인터페이스를 구현하여 실제 객체를 생성하는 클래스입니다.
  • Director (디렉터): 빌더 객체를 통해 각 단계별로 생성 과정을 정의하여 최종 제품을 반환합니다.
  • Product (제품): 생성될 복합 객체입니다. 여러 단계에서 설정되는 속성을 포함합니다.

장점

  • 코드의 가독성이 높아지고, 객체 생성 로직이 명확하게 드러납니다.
  • 불변 객체를 쉽게 만들 수 있습니다. 객체 생성 후에는 속성이 변경되지 않도록 할 수 있습니다.
  • 복잡한 객체 생성 시 객체의 일관성을 보장합니다. 필수 필드가 누락되었을 때 에러를 발생시키는 등의 로직을 추가할 수 있습니다.

예제 코드

# Product Class
class UserProfile:
    def __init__(self, name, age, address, phone, email):
        self.name = name
        self.age = age
        self.address = address
        self.phone = phone
        self.email = email

    def __str__(self):
        return f"UserProfile(name={self.name}, age={self.age}, address={self.address}, phone={self.phone}, email={self.email})"

# Builder Class
class UserProfileBuilder:
    def __init__(self):
        self.name = None
        self.age = None
        self.address = None
        self.phone = None
        self.email = None

    def set_name(self, name):
        self.name = name
        return self

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

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

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

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

    def build(self):
        # 필요한 속성을 체크하고, 조건이 만족되면 최종 객체를 반환
        if self.name is None or self.age is None:
            raise ValueError("Name and age are required")
        return UserProfile(self.name, self.age, self.address, self.phone, self.email)

# Client Code
try:
    user = (UserProfileBuilder()
            .set_name("Alice")
            .set_age(30)
            .set_address("123 Main St")
            .set_phone("555-1234")
            .set_email("alice@example.com")
            .build())

    print(user)
    # 출력:
    # UserProfile(name=Alice, age=30, address=123 Main St, phone=555-1234, email=alice@example.com)
except ValueError as e:
    print(f"Error: {e}")
profile
할수 있다! code able
post-custom-banner

0개의 댓글