Swift 디자인패턴 Builder Pattern (빌더 패턴)
Builder 패턴은 복잡한 객체를 단계적으로 생성할 수 있도록 설계된 생성 패턴
객체 생성 과정에서 다양한 설정 옵션이나 순서를 필요로 하는 경우 유용하며, Builder 패턴은 객체 생성 로직을 분리하여 코드의 가독성과 재사용성을 높임.
히스토리
- 2022-04-22: 디자인 패턴 스터디 정리
- 2024-11-29: 포스팅 글 재정리 및 조금 더 실용적인 예제 코드로 변경
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
https://refactoring.guru/ko/design-patterns/builder
'apple > DesignPattern, Architecture' 카테고리의 다른 글
Swift 디자인패턴 Factory Pattern (팩토리 패턴) (0) | 2022.05.08 |
---|---|
Swift 디자인패턴 MVVM Pattern (MVVM 패턴) (0) | 2022.04.26 |
Swift 디자인패턴 Observer Pattern (옵저버 패턴) (0) | 2022.04.19 |
Swift 디자인패턴 Memento Pattern (메멘토 패턴) (0) | 2022.04.13 |
Swift 디자인패턴 Singleton Pattern (싱글톤 패턴) (0) | 2022.04.12 |