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