빌더 패턴은 객체 생성 과정을 추상화하고 복잡한 객체를 구축하기 위한 디자인 패턴 중 하나입니다.
이 패턴은 생성자의 매개변수가 많거나 복잡한 경우, 객체 생성을 더 편리하게 만들어주며 가독성을 높일 수 있는 방법을 제공합니다.
객체가 많은 속성을 가지고 복잡한 초기화 과정이 필요한 경우, 빌더 패턴을 사용하여 이를 더 간결하게 관리할 수 있습니다.
생성자에 여러 매개변수가 있는 경우, 이를 명시적으로 표현하고 가독성을 향상시키기 위해 사용할 수 있습니다.
빌더 패턴은 객체 생성 과정을 단계별로 나누어 유연성을 제공하므로, 다양한 종류의 객체를 생성할 수 있습니다.
객체 생성 단계를 추상화하는 인터페이스를 제공합니다. 빌더 인터페이스는 객체의 속성을 설정하는 메서드를 정의하며, 구체적인 빌더 클래스가 구현합니다.
빌더 인터페이스를 구현하여 객체 생성 과정을 구체화합니다.
객체의 속성을 설정하고 최종 객체를 반환하는 역할을 합니다.
객체 생성 과정을 조율하고 제어하는 역할을 합니다. 필요한 속성 값을 빌더를 통해 설정하고 최종 객체를 반환합니다.
최종적으로 생성되는 복잡한 객체입니다. 빌더를 통해 생성된 객체입니다.
protocol PizzaBuilder {
func setCrust(_ crust: String)
func setSauce(_ sauce: String)
func setToppings(_ toppings: [String])
func build() -> Pizza
}
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)
}}
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()
}}
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)