返回

Swift 设计模式:Builder

IOS

概述

Builder 设计模式的主要优点包括:

  • 将复杂对象的创建过程抽象出来,使得创建复杂对象的过程变得更加容易。
  • 提高代码的可读性和可维护性。
  • 代码更加灵活,可以轻松地创建不同类型的复杂对象。
  • 遵循单一职责原则和分离关注点原则。

用法

Builder 设计模式的实现方式有很多种,但总体来说,它遵循以下步骤:

  1. 定义一个 Builder 接口,该接口包含创建复杂对象的所有步骤。
  2. 定义一个具体的 Builder 类,该类实现了 Builder 接口中的所有方法,并负责创建复杂对象的各个部分。
  3. 定义一个 Director 类,该类负责调用 Builder 类中的方法,并最终创建复杂对象。
  4. 使用 Builder 类和 Director 类创建复杂对象。

示例

以下是一个使用 Builder 设计模式创建复杂对象的示例:

protocol PizzaBuilder {
  func buildCrust()
  func buildSauce()
  func buildToppings()
  func buildCheese()
  func getPizza() -> Pizza
}

class MargheritaPizzaBuilder: PizzaBuilder {
  private var pizza: Pizza!

  func buildCrust() {
    pizza.crust = "Thin crust"
  }

  func buildSauce() {
    pizza.sauce = "Tomato sauce"
  }

  func buildToppings() {
    pizza.toppings = ["Mozzarella cheese", "Fresh basil"]
  }

  func buildCheese() {
    pizza.cheese = "Parmesan cheese"
  }

  func getPizza() -> Pizza {
    return pizza
  }

  init() {
    pizza = Pizza()
  }
}

class PepperoniPizzaBuilder: PizzaBuilder {
  private var pizza: Pizza!

  func buildCrust() {
    pizza.crust = "Thick crust"
  }

  func buildSauce() {
    pizza.sauce = "Spicy tomato sauce"
  }

  func buildToppings() {
    pizza.toppings = ["Pepperoni", "Mozzarella cheese"]
  }

  func buildCheese() {
    pizza.cheese = "Provolone cheese"
  }

  func getPizza() -> Pizza {
    return pizza
  }

  init() {
    pizza = Pizza()
  }
}

class PizzaDirector {
  private var builder: PizzaBuilder!

  func setBuilder(builder: PizzaBuilder) {
    self.builder = builder
  }

  func buildPizza() {
    builder.buildCrust()
    builder.buildSauce()
    builder.buildToppings()
    builder.buildCheese()
  }

  func getPizza() -> Pizza {
    return builder.getPizza()
  }
}

class Pizza {
  var crust: String!
  var sauce: String!
  var toppings: [String]!
  var cheese: String!

  func printPizza() {
    print("Crust:", crust)
    print("Sauce:", sauce)
    print("Toppings:", toppings.joined(separator: ", "))
    print("Cheese:", cheese)
  }
}

// Usage

let pizzaDirector = PizzaDirector()
pizzaDirector.setBuilder(builder: MargheritaPizzaBuilder())
pizzaDirector.buildPizza()
let margheritaPizza = pizzaDirector.getPizza()
margheritaPizza.printPizza()

pizzaDirector.setBuilder(builder: PepperoniPizzaBuilder())
pizzaDirector.buildPizza()
let pepperoniPizza = pizzaDirector.getPizza()
pepperoniPizza.printPizza()

输出:

Crust: Thin crust
Sauce: Tomato sauce
Toppings: Mozzarella cheese, Fresh basil
Cheese: Parmesan cheese

Crust: Thick crust
Sauce: Spicy tomato sauce
Toppings: Pepperoni, Mozzarella cheese
Cheese: Provolone cheese