apple/DesignPattern, Architecture

Swift 디자인패턴 Builder Pattern (빌더 패턴)

lgvv 2022. 4. 22. 08:00

Swift 디자인패턴 Builder Pattern (빌더 패턴)

 

Builder 패턴은 복잡한 객체를 단계적으로 생성할 수 있도록 설계된 생성 패턴

객체 생성 과정에서 다양한 설정 옵션이나 순서를 필요로 하는 경우 유용하며, Builder 패턴은 객체 생성 로직을 분리하여 코드의 가독성과 재사용성을 높임.

 

히스토리

  • 2022-04-22: 디자인 패턴 스터디 정리
  • 2024-11-29: 포스팅 글 재정리 및 조금 더 실용적인 예제 코드로 변경

Builder Pattern

 


Builder Pattern

빌더 패턴은 기본적으로 3가지 구성요소와 선택 사항으로 1가지가 추가되어 구성됨

  • Builder: 객체 생성 단계를 정의하는 인터페이스 제공 및 각 단계 별 생성해야 할 객체의 세부사항 결정
  • Concrete Builder: Builder 인터페이스 구현 및 실제 객체를 생성
  • Product: Builder가 생성하는 객체
  • (선택) Director: Builder의 생성 단계를 호출하는 역할로 생성 절차를 정의해 특정 객체를 단계적으로 생성

빌더 패턴 흐름

  • Builder가 생성 절차 정의
  • Concrete Builder가 구체적인 구현 제공
  • 필요하다면 Director가 객체 생성 순서 제어
  • 최종적으로 Product 객체를 클라이언트가 사용

빌더 패턴 적용하면 좋은 경우

  • 복잡한 객체 생성: 객체 생성 과정에서 많은 단계나 옵션이 필요한 경우
  • 코드 가독성 향상: 생성자 또는 팩토리 메서드가 너무 복잡해지는 것을 방지하고 싶은 경우
  • 유연한 객체 생성: 동일한 생성 절차를 사용하여 서로 다른 객체를 생성하고 싶은 경우


코드 예제

아래는 UIModel을 Builder를 활용해서 만드는 과정 예시

  • Director도 사용하고 있음
  • Builder는 생성패턴이므로, 생성에 필요한 조건 이외에 Policy 등이 적용될 경우 Massive 해져서 Policy는 별도로 처리할 것
import SwiftUI

struct UIModel {
    let title: String?
    let viewership: Int?
}

protocol UIModelBuilder {
    func setTitle(_ title: String) -> Self
    func setViewership(_ viewership: Int) -> Self
    func build() -> UIModel
}

class ListUIModelBuilder: UIModelBuilder {
    var title: String?
    var viewership: Int?
    
    func setTitle(_ title: String) -> Self {
        self.title = title
        return self
    }
    
    func setViewership(_ viewership: Int) -> Self {
        self.viewership = viewership
        return self
    }
    
    func build() -> UIModel {
        return UIModel(title: title, viewership: viewership)
    }
}

final class UIModelDirector {
    private let builder: UIModelBuilder
    
    init(builder: UIModelBuilder) {
        self.builder = builder
    }
    
    func constructHGrid() -> UIModel {
        return builder
            .setTitle("Director - HGrid")
            .setViewership(2000)
            .build()
    }
    
    func constructVGrid() -> UIModel {
        return builder
            .setTitle("Director - VGrid")
            .setViewership(1000)
            .build()
    }
    
}

private struct ContentView: View {
    var body: some View {
        Button("Execute") {
            let builder = ListUIModelBuilder()
            
            let uiModel = builder
                .setTitle("Builder - Title")
                .setViewership(1000)
                .build()
            
            print("request: ", uiModel.title, uiModel.viewership)
            
            let director1 = UIModelDirector(builder: builder).constructHGrid()
            let director2 = UIModelDirector(builder: builder).constructVGrid()
            print("director1: ", director1.title, director1.viewership)
            print("director2: ", director2.title, director2.viewership)
        }
    }
}

#Preview {
    ContentView()
}

 

결과

 

 

(참고)

https://www.raywenderlich.com/books/design-patterns-by-tutorials/v3.0/chapters/9-builder-pattern

 

Design Patterns by Tutorials, Chapter 9: Builder Pattern

The builder pattern allows the creation of complex objects step-by-step, instead of all at once, via an initializer. For example, you can use this pattern to implement a “hamburger builder”. The product could be a “hamburger” model, which has input

www.kodeco.com:443

https://refactoring.guru/ko/design-patterns/builder

 

빌더 패턴

/ 디자인 패턴들 / 생성 패턴 빌더 패턴 다음 이름으로도 불립니다: Builder 의도 빌더는 복잡한 객체들을 단계별로 생성할 수 있도록 하는 생성 디자인 패턴입니다. 이 패턴을 사용하면 같은 제작

refactoring.guru