본문 바로가기

카테고리 없음

swift) 빌더 패턴 알아보기

반응형

빌더 패턴이란?

복잡한 객체의 생성을 단계적으로 처리할 수 있도록 도와주는 디자인 패턴

생성자에서 모든 매개변수를 한 번에 받는 방식과 달리 빌더 패턴은 체이닝 방식을 활용하여 객체를 점직적으로 구성할 수 있다.

 

특징

  • 객체 생성을 단계적으로 수행 가능 (체이닝을 지원)
  • 때문에 읽기 쉬운 코드 구조를 만들 수 있음

빌드 패턴을 사용하지 않는 경우

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 안에 다른 생성자를 만들 수 있게 제공하면  최소한의 수정으로 대응할 수 있게 된다. 

반응형