[디자인 패턴] Builder Pattern

전성훈·2023년 10월 31일
0

DesignPattern

목록 보기
4/18
post-thumbnail

주제: 복잡한 객체의 생성 절차 단순화


빌더 패턴이란 복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴이다. -위키백과

빌더 패턴이란

  • 빌더 패턴은 객체에 생성하는 복잡한 프로세스를 캡슐화하여 객체를 쉽게 생성하고, 코드의 가독성과 유지보수성을 높이기 위해 사용된다.
  • 빌드 패턴은 타입의 인스턴스가 설정 가능한 여러 값을 요구하는 문제를 해결하기 위해 설계되었다.

구조 이해하기

빌더

  • 빌더 패턴의 구조는 단순하다. 어떤 Product와 이를 만드는 Builder로 구성되어 있다.
  • Builder는 어떤 값들을 세팅하는 메서드와 최종적으로 Product를 만드는 build() 메서드를 가지게 된다. 이때 Product를 만드는 모든 과정은 Builder가 담당하게 된다.

예시 코드

  • 예시 코드 1
import Foundation

struct MacBook {
    let color: String
    let memory: Int
    let storage: String
    let hasTouchBar: Bool
}

class MacBookBuilder {
    private var color = "Space Gray"
    private var memory = 16
    private var storage = "256GB"
    private var hasTouchBar = false
    
    func setColor(_ color: String) -> MacBookBuilder {
        self.color = color
        return self
    }
    
    func setMemory(_ memory: Int) -> MacBookBuilder {
        self.memory = memory
        return self
    }
    
    func setStorage(_ storage: String) -> MacBookBuilder {
        self.storage = storage
        return self
    }
    
    func setHasTouchBar(_ has: Bool) -> MacBookBuilder {
        self.hasTouchBar = has
        return self
    }
    
    func build() -> MacBook {
        return MacBook(color: color, memory: memory, storage: storage, hasTouchBar: hasTouchBar)
    }
}

let builder = MacBookBuilder()

let macBook1 = builder.setColor("Sliver").setMemory(32).setStorage("512GB").setHasTouchBar(true).build()
let macBook2 = builder.setMemory(32).setStorage("1TB").build()
let macBook3 = builder.build()
  • 예시 코드 2
struct Pizza {
    var size: Int
    var cheese: Bool
    var pepperoni: Bool
    var sausage: Bool
    var mushrooms: Bool
    var olives: Bool
}

class PizzaBuilder {
    private var size: Int = 12
    private var cheese: Bool = false
    private var pepperoni: Bool = false
    private var sausage: Bool = false
    private var mushrooms: Bool = false
    private var olives: Bool = false

    func setSize(_ size: Int) -> PizzaBuilder {
        self.size = size
        return self
    }

    func setCheese(_ cheese: Bool) -> PizzaBuilder {
        self.cheese = cheese
        return self
    }

    func setPepperoni(_ pepperoni: Bool) -> PizzaBuilder {
        self.pepperoni = pepperoni
        return self
    }

    func setSausage(_ sausage: Bool) -> PizzaBuilder {
        self.sausage = sausage
        return self
    }

    func setMushrooms(_ mushrooms: Bool) -> PizzaBuilder {
        self.mushrooms = mushrooms
        return self
    }

    func setOlives(_ olives: Bool) -> PizzaBuilder {
        self.olives = olives
        return self
    }

    func build() -> Pizza {
        return Pizza(
            size: size,
            cheese: cheese,
            pepperoni: pepperoni,
            sausage: sausage,
            mushrooms: mushrooms,
            olives: olives
        )
    }
}

// Builder Pattern을 사용하여 Pizza 객체를 생성하는 예
let pizza = PizzaBuilder()
    .setSize(16)
    .setCheese(true)
    .setPepperoni(true)
    .setMushrooms(true)
    .build()

결론

  • Swift에서는 Builder코드를 작성하지 않아도 Swift의 초기화 메서드와 프로퍼티 기본값을 활용하여 좀 더 간결하게 표현할 수 있다.
  • 즉, Builder 패턴은 Swift에서 그렇게까지 유효한 패턴은 아니다.
  • 대부분 초기화 메서드와 프로퍼티 기본값을 활용하여 해결할 수 있으니말이다. 굳이 빌더 패턴의 사용처를 생각해본다면, 프로퍼티의 개수가 엄청나게 많아지고 복잡해지는 경우를 생각해 볼 수 있을 것이다.

출처(참고문헌)

제가 학습한 내용을 요약하여 정리한 것입니다. 내용에 오류가 있을 수 있으며, 어떠한 피드백도 감사히 받겠습니다.

감사합니다.

0개의 댓글