1. 程式人生 > Android開發 >?通過KFC點餐來學習建造者模式

?通過KFC點餐來學習建造者模式

思考

軟體是什麼?軟體是為瞭解決生活中實際的問題而存在的,軟體中的設計模式也恰好是限時生活中的總結,甚至如果你設計模式弄好了,不僅僅是軟體更具有擴充套件性,而且會反哺到你的實際生活中,下面我們就用KFC舉例。

KFC點餐

進到KFC中,會有很多套餐,A、B、C、D。

  • 小一點的只有一個點餐的地方,大一點的會有多個同時點餐的地方。
  • 有很多服務員,準備顧客點的各種套餐
  • 後廚,這些是套餐的真正建造者。

我們通過建造者模式來完成這個流程。

建立模式之構建者模式

  • KFCWaiter:指揮者 物件指揮具體的MealBuilder從而得到完整的套餐
  • MealBuilder:抽象建造者
  • MealBuilderA:具體建造者
  • Meal:套餐

KFC 點餐程式碼


class KFCBuilder{
    enum MealType{
        case mealA
        case mealB
    }
    /// 點餐
    func orderMeal(type:MealType) throws{
        var mealBuilder:MealBuilder?
        switch type {
        case .mealA:
            mealBuilder = MealBuilderA()
        case .mealB:
            mealBuilder = MealBuilderB()
        }
        guard let builder = mealBuilder else{
            throw(NSError())
        }
       let waiter = KFCWaiter()
       waiter.setMealBuilder(builder)
    }
複製程式碼

} 複製程式碼

Director:指揮者

class KFCWaiter{
private(set) var mb:MealBuilder?
/// 構建
func construct()->Meal?{
    mb?.buildDrink()
    mb?.buildMeal()
    return mb?.getMeal()
}
func setMealBuilder(_ mb:MealBuilder){
    self.mb = mb
}
複製程式碼
複製程式碼

套餐

class Meal{
    var drink:String?
    var food:String?
}
複製程式碼

建造者

/// 抽象建造者
class MealBuilder{
    lazy var meal:Meal = Meal()
    func buildDrink(){
}
func buildMeal(){
    
}
func getMeal()->Meal?{
    return meal
}
複製程式碼

} /// 具體建造者A class MealBuilderA:MealBuilder{ override func buildDrink(){ meal.drink = "A 型別喝的" } override func buildMeal(){ meal.food = "A 型別吃的" } } /// 具體建造者B class MealBuilderB:MealBuilder{ override func buildDrink(){ meal.drink = "B 型別喝的" } override func buildMeal(){ meal.food = "B 型別吃的" } }

複製程式碼

複製程式碼

有些餐廳會把東西組裝好,直接給你送過來這時waiter和builder的角色就合併為一個了,當店鋪越來越大時,人越來越多,責任細化,就會再次劃分,公司也是這樣。

區分

建造者模式與工廠三兄弟的區分:

  • 需要建立一個簡單產品時,用工廠三兄弟
  • 需要建立一個組合產品時,用建造者模式

參考

  • https://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/builder.html

本文使用 mdnice 排版