设计模式学习 - 工厂模式
生活随笔
收集整理的這篇文章主要介紹了
设计模式学习 - 工厂模式
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
工廠模式:
定義了一個創(chuàng)建對象的接口,但由它的子類決定實例化哪一個對象。工廠方法將對象的實例化延遲到了子類。?
模式組成:
- 一組使用者:父類定義一個創(chuàng)建對象的接口及其他通用接口,子類負責創(chuàng)建對象接口的具體實現(xiàn)(在案例中為 PizzaStore 及?NYPizzaStore)
- 一組產(chǎn)品類:(在案例中為 抽象Pizza類及其具體實現(xiàn)的子類)
?
注:
?
UML 類圖:
?
代碼具體實現(xiàn):
1、 對象的創(chuàng)建者: PizzaStore 類
// pizza Store 父類:包含了創(chuàng)建pizza(createPizza)這個抽象方法 class PizzaStore {// 包含了一個產(chǎn)品的抽象類 和 一個簡單工廠var pizza:Pizza = Pizza()// 提供 pizza 方法 func orderPizza(pizzatype: Pizzatype) {// 獲取相應(yīng)商店創(chuàng)建的 pizza 對象的引用self.pizza = createPizza(pizzatype)// 產(chǎn)品的行為 pizza.prepare()pizza.bake()pizza.cut()pizza.box()}// 創(chuàng)建一個 負責創(chuàng)建對象的接口,但是它由實現(xiàn)子類具體實現(xiàn)func createPizza(pizzatype: Pizzatype) -> Pizza {return Pizza()} }// 紐約Pizza商店:負責創(chuàng)建紐約風味的Pizza class NYPizzaStore: PizzaStore {// 具體實現(xiàn) 負責創(chuàng)建對象的接口override func createPizza(pizzatype: Pizzatype) -> Pizza {switch pizzatype {case Pizzatype.Cheese:pizza = NYCheesePizza()case Pizzatype.Clam:pizza = NYClamPizza()}return pizza} }// 芝加哥Pizza商店:負責創(chuàng)建芝加哥風味的Pizza class ChicagoPizzaStore: PizzaStore {// 具體實現(xiàn) 負責創(chuàng)建對象的接口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 /* 先調(diào)用了 NYPizzaStore 的 orderPizza 方法,再由 orderPizza 方法調(diào)用 createPizza 方法; 其中 orderPizza 方法是父類創(chuàng)建的,為子類所共有使用,orderPizza 并不需要知道這個 Pizza 到底是哪一個種類的,只需要知道這是一個 Pizza 能進行準備、裁剪等行為就足夠了 而 createPizza 方法則是子類自己按照相應(yīng)的情況具體實現(xiàn)去創(chuàng)建相應(yīng)風味的 Pizza; */ pizzaStore.orderPizza(Pizzatype.Cheese)// 再訪問 芝加哥Pizza商店,買一個芝加哥風味的ClamPizza pizzaStore = ChicagoPizzaStore() pizzaStore.orderPizza(Pizzatype.Clam)?
4、測試結(jié)果
?
?
?
?
?
?
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/ziyeSky/p/4494846.html
總結(jié)
以上是生活随笔為你收集整理的设计模式学习 - 工厂模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java基础-四要素之一《封装》
- 下一篇: [Objective-c 基础 - 2.