Swift 기초 문법 - 41. 디자인패턴 빌더패턴

정성윤·2023년 8월 12일
0

Swift 이론

목록 보기
44/64

빌더 패턴은 객체 생성 과정을 추상화하고 복잡한 객체를 구축하기 위한 디자인 패턴 중 하나입니다.

이 패턴은 생성자의 매개변수가 많거나 복잡한 경우, 객체 생성을 더 편리하게 만들어주며 가독성을 높일 수 있는 방법을 제공합니다.

1. 복잡한 객체 생성

객체가 많은 속성을 가지고 복잡한 초기화 과정이 필요한 경우, 빌더 패턴을 사용하여 이를 더 간결하게 관리할 수 있습니다.

2. 객체 생성 과정의 가독성 향상

생성자에 여러 매개변수가 있는 경우, 이를 명시적으로 표현하고 가독성을 향상시키기 위해 사용할 수 있습니다.

3. 유연한 객체 생성

빌더 패턴은 객체 생성 과정을 단계별로 나누어 유연성을 제공하므로, 다양한 종류의 객체를 생성할 수 있습니다.

< 구성 >

1. Builder :

객체 생성 단계를 추상화하는 인터페이스를 제공합니다. 빌더 인터페이스는 객체의 속성을 설정하는 메서드를 정의하며, 구체적인 빌더 클래스가 구현합니다.

2. ConcreteBuilder :

빌더 인터페이스를 구현하여 객체 생성 과정을 구체화합니다.
객체의 속성을 설정하고 최종 객체를 반환하는 역할을 합니다.

3. Director :

객체 생성 과정을 조율하고 제어하는 역할을 합니다. 필요한 속성 값을 빌더를 통해 설정하고 최종 객체를 반환합니다.

4. Product :

최종적으로 생성되는 복잡한 객체입니다. 빌더를 통해 생성된 객체입니다.

// Builder 인터페이스

protocol PizzaBuilder {
    func setCrust(_ crust: String)
    func setSauce(_ sauce: String)
    func setToppings(_ toppings: [String])
    func build() -> Pizza
}

// ConcreteBuilder 클래스

class MargheritaPizzaBuilder: PizzaBuilder {
    private var crust: String = ""
    private var sauce: String = ""
    private var toppings: [String] = []
    
    func setCrust(_ crust: String) {
        self.crust = crust
    }
    
    func setSauce(_ sauce: String) {
        self.sauce = sauce
    }
    
    func setToppings(_ toppings: [String]) {
        self.toppings = toppings
    }
    
    func build() -> Pizza {
        return Pizza(crust: crust, sauce: sauce, toppings: toppings)
    }}

// Director 클래스

class PizzaDirector {
    private var builder: PizzaBuilder
    
    init(builder: PizzaBuilder) {
        self.builder = builder
    }
    
    func makePizza() -> Pizza {
        builder.setCrust("Thin Crust")
        builder.setSauce("Tomato Sauce")
        builder.setToppings(["Cheese", "Basil"])
        return builder.build()
    }}

// Product 클래스

struct Pizza {
    let crust: String
    let sauce: String
    let toppings: [String]
    
    func describe() {
        print("Pizza with \(crust), \(sauce), and \(toppings.joined(separator: ", "))")
    }}

// 빌더 패턴 사용 예시

let margheritaBuilder = MargheritaPizzaBuilder()
let director = PizzaDirector(builder: margheritaBuilder)
let margheritaPizza = director.makePizza()
margheritaPizza.describe() // 출력: Pizza with Thin Crust, Tomato Sauce, and Cheese, Basil

참고(출처) : 개발하는 정대리, 야곰(Swift5)

profile
이유있는 스위프트 개발자

0개의 댓글