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