當前位置:
首頁 >
设计模式学习 - 工厂模式
發布時間:2025/4/16
54
豆豆
生活随笔
收集整理的這篇文章主要介紹了
设计模式学习 - 工厂模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
工廠模式:
定義了一個創建對象的接口,但由它的子類決定實例化哪一個對象。工廠方法將對象的實例化延遲到了子類。?
模式組成:
- 一組使用者:父類定義一個創建對象的接口及其他通用接口,子類負責創建對象接口的具體實現(在案例中為 PizzaStore 及?NYPizzaStore)
- 一組產品類:(在案例中為 抽象Pizza類及其具體實現的子類)
?
注:
?
UML 類圖:
?
代碼具體實現:
1、 對象的創建者: PizzaStore 類
// pizza Store 父類:包含了創建pizza(createPizza)這個抽象方法 class PizzaStore {// 包含了一個產品的抽象類 和 一個簡單工廠var pizza:Pizza = Pizza()// 提供 pizza 方法 func orderPizza(pizzatype: Pizzatype) {// 獲取相應商店創建的 pizza 對象的引用self.pizza = createPizza(pizzatype)// 產品的行為 pizza.prepare()pizza.bake()pizza.cut()pizza.box()}// 創建一個 負責創建對象的接口,但是它由實現子類具體實現func createPizza(pizzatype: Pizzatype) -> Pizza {return Pizza()} }// 紐約Pizza商店:負責創建紐約風味的Pizza class NYPizzaStore: PizzaStore {// 具體實現 負責創建對象的接口override func createPizza(pizzatype: Pizzatype) -> Pizza {switch pizzatype {case Pizzatype.Cheese:pizza = NYCheesePizza()case Pizzatype.Clam:pizza = NYClamPizza()}return pizza} }// 芝加哥Pizza商店:負責創建芝加哥風味的Pizza class ChicagoPizzaStore: PizzaStore {// 具體實現 負責創建對象的接口override func createPizza(pizzatype: Pizzatype) -> Pizza {switch pizzatype {case Pizzatype.Cheese:pizza = ChicagoCheesePizza()case Pizzatype.Clam:pizza = ChicagoClamPizza()}return pizza} }?
2、對象類:
// 對象的父類 class Pizza {var name:String = ""var dough:String = ""var sauce:String = ""var toppings:[String] = []// 準備pizza 方法 func prepare() {println("正在準備 \(name) ...")println("Tossing dough...")println("加入 \(sauce)...")for topping:String in toppings {println(" \(topping)")}}func box() {println("正在打包...\n")}func bake() {println("正在烘焙...")}func cut() {println("正在裁剪...")} }// 一個紐約風味的 Cheese Pizza; 它與 紐約風味的 Clem Pizza 同為一組 class NYCheesePizza: Pizza {override init() {super.init()self.name = "紐約風味的 Cheese Pizza"self.dough = "Thin Crust Dough"self.sauce = "草莓 醬汁"toppings.append("Grated Reggino Cheese")} }// 一個紐約風味的 Clam Pizza class NYClamPizza: Pizza {override init() {super.init()self.name = "紐約風味的 NYClam Pizza"self.dough = "Low Crust Dough"self.sauce = "櫻桃 醬汁"toppings.append("Grated Reggino Clam")} }// 一個芝加哥風味的 Cheese Pizza; 它與 芝加哥風味的 Clem Pizza 同為一組 class ChicagoCheesePizza: Pizza {override init() {super.init()self.name = "芝加哥風味的 Cheese Pizza"self.dough = "Thin Crust Dough"self.sauce = "芒果 醬汁"toppings.append("Grated Reggino Cheese")}// 子類也可以覆蓋父類的方法override func cut() {println("正在裁剪:裁剪成方塊狀...")} }// 一個芝加哥風味的 Clam Pizza class ChicagoClamPizza: Pizza {override init() {super.init()self.name = "芝加哥風味的 Clam Pizza"self.dough = "Low Crust Dough"self.sauce = "烤肉 醬汁"toppings.append("Grated Reggino Clam")}// 子類也可以覆蓋父類的方法override func cut() {println("正在裁剪:裁剪成方塊狀...")} }?
3、測試代碼:
// 先訪問 紐約Pizza商店 var pizzaStore: PizzaStore = NYPizzaStore() // 買一個紐約風味的CheesePizza /* 先調用了 NYPizzaStore 的 orderPizza 方法,再由 orderPizza 方法調用 createPizza 方法; 其中 orderPizza 方法是父類創建的,為子類所共有使用,orderPizza 并不需要知道這個 Pizza 到底是哪一個種類的,只需要知道這是一個 Pizza 能進行準備、裁剪等行為就足夠了 而 createPizza 方法則是子類自己按照相應的情況具體實現去創建相應風味的 Pizza; */ pizzaStore.orderPizza(Pizzatype.Cheese)// 再訪問 芝加哥Pizza商店,買一個芝加哥風味的ClamPizza pizzaStore = ChicagoPizzaStore() pizzaStore.orderPizza(Pizzatype.Clam)?
4、測試結果
?
?
?
?
?
?
?
?
?
?
?
轉載于:https://www.cnblogs.com/ziyeSky/p/4494846.html
總結
以上是生活随笔為你收集整理的设计模式学习 - 工厂模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java基础-四要素之一《封装》
- 下一篇: KindEditor编辑器在ASP.NE