?通過KFC點餐來學習建造者模式
阿新 • • 發佈:2020-06-24
思考
軟體是什麼?軟體是為瞭解決生活中實際的問題而存在的,軟體中的設計模式也恰好是限時生活中的總結,甚至如果你設計模式弄好了,不僅僅是軟體更具有擴充套件性,而且會反哺到你的實際生活中,下面我們就用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 排版