반응형
빌더 패턴이란?
복잡한 객체의 생성을 단계적으로 처리할 수 있도록 도와주는 디자인 패턴
생성자에서 모든 매개변수를 한 번에 받는 방식과 달리 빌더 패턴은 체이닝 방식을 활용하여 객체를 점직적으로 구성할 수 있다.
특징
- 객체 생성을 단계적으로 수행 가능 (체이닝을 지원)
- 때문에 읽기 쉬운 코드 구조를 만들 수 있음
빌드 패턴을 사용하지 않는 경우
struct UserProfile {
let name: String
let age: Int
let email: String?
let phoneNumber: String?
init(name: String, age: Int, email: String? = nil, phoneNumber: String? = nil) {
self.name = name
self.age = age
self.email = email
self.phoneNumber = phoneNumber
}
}
let user = UserProfile(name: "홍길동", age: 30, email: "ex@example.com")
빌더 패턴을 사용하지 않는다면, 객체 생성을 위한 생성자에서 모든 매개변수를 받아야
빌드 패턴 예시
class UserProfileBuilder {
private var name: String = ""
private var age: Int = 0
private var email: String? = nil
private var phoneNumber: String? = nil
func setName(_ name: String) -> UserProfileBuilder {
self.name = name
return self
}
func setAge(_ age: Int) -> UserProfileBuilder {
self.age = age
return self
}
func setEmail(_ email: String) -> UserProfileBuilder {
self.email = email
return self
}
func setPhoneNumber(_ phoneNumber: String) -> UserProfileBuilder {
self.phoneNumber = phoneNumber
return self
}
func build() -> UserProfile {
return UserProfile(name: name, age: age, email: email, phoneNumber: phoneNumber)
}
}
let user = UserProfileBuilder()
.setName("홍길동")
.setAge(30)
.setEmail("ex@example.com")
.build()
빌드패턴을 사용하게 되면 가독성이 나아진다. 왜냐하면 만들고싶은 매개변수를 밑으로 만들어나가면서 직관적으로 어떤 값이 설정되는지 파악할 수 있다.
struct ProfileEntity {
let name: String
let age: Int
func setUpperCasedName() -> ProfileEntity {
return ProfileEntity(name: name.uppercased(), age: age)
}
}
빌더 패턴을 활용하여 Entity를 사용할 때 표현 방식이 달라져야 하는 경우에 사용한다. View에서 Entity를 표현하고자 할 때 View로 끌어오게 된다면 사용하는 곳마다 수정이 필요하게 된다. 반면 이렇게 Entity 안에 다른 생성자를 만들 수 있게 제공하면 최소한의 수정으로 대응할 수 있게 된다.
반응형