歡迎來到裝配圖網(wǎng)! | 幫助中心 裝配圖網(wǎng)zhuangpeitu.com!
裝配圖網(wǎng)
ImageVerifierCode 換一換
首頁 裝配圖網(wǎng) > 資源分類 > PPT文檔下載  

java工廠設(shè)計模式.ppt

  • 資源ID:8621466       資源大?。?span id="vr6bv5d" class="font-tahoma">1.16MB        全文頁數(shù):50頁
  • 資源格式: PPT        下載積分:9.9積分
快捷下載 游客一鍵下載
會員登錄下載
微信登錄下載
三方登錄下載: 微信開放平臺登錄 支付寶登錄   QQ登錄   微博登錄  
二維碼
微信掃一掃登錄
下載資源需要9.9積分
郵箱/手機:
溫馨提示:
用戶名和密碼都是您填寫的郵箱或者手機號,方便查詢和重復(fù)下載(系統(tǒng)自動生成)
支付方式: 支付寶    微信支付   
驗證碼:   換一換

 
賬號:
密碼:
驗證碼:   換一換
  忘記密碼?
    
友情提示
2、PDF文件下載后,可能會被瀏覽器默認打開,此種情況可以點擊瀏覽器菜單,保存網(wǎng)頁到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無水印,預(yù)覽文檔經(jīng)過壓縮,下載后原文更清晰。
5、試題試卷類文檔,如果標題沒有明確說明有答案則都視為沒有答案,請知曉。

java工廠設(shè)計模式.ppt

TheFactoryPattern 工廠模式 學(xué)習(xí)問題 隨著經(jīng)濟的全球化 一個軟件可能要在全球銷售 因此 我們設(shè)計的軟件應(yīng)該能夠通過簡單的配置就可以適應(yīng)不同的國家 本講所學(xué)的知識將能提供一種有助于解決此問題的方法 對象創(chuàng)建問題 關(guān)于new 按照面向抽象的設(shè)計原則 我們應(yīng)該面向接口編程而不是面向?qū)崿F(xiàn)編程 但是我們每次使用new時 是不是正在違背這一原則呢 我們想用接口 但卻必須建立一個具體類的實例 Duckduck newMallardDuck 問題 當你擁有一組相關(guān)的具體類時 你常常被迫寫出類似下面的代碼 Duckduck If picnic duck newMallardDuck elseif hunting duck newDecoyDuck elseif inBathTub duck newRubberDuck 這樣做的原因是直到運行時我們才知道需要實例化那個類 這樣做的后果是如果應(yīng)用要做變化或擴展 往往要修改這段代碼 這使得維護困難并容易引入錯誤 問題在哪里 是new的問題嗎 從技術(shù)上來說 new并沒有任何問題 new是java最基本的部分 真正的問題在于 變化 如果對接口編程 我們可實現(xiàn)與許多 變化 的隔離 因為通過多態(tài)機制 你的代碼對于實現(xiàn)接口的新類依然適用 但是使用具體類麻煩就來了 因為增加新的具體類時相應(yīng)代碼可能就必須修改 怎么辦呢 Duckduck newMallardDuck 上面這段代碼所在的模塊與MallardDuck模塊形成了耦合 再回憶我們前面提出的面向?qū)ο笤O(shè)計的原則 識別應(yīng)用的變化部分 并將之與固定的部分相分離 區(qū)分變化的部分 下面我們來看一個例子Pizza店 披薩 PizzaStore類中的一段代碼 訂做pizza PublicClassPizzaStore PizzaorderPizza Pizzapizza newPizza pizza prepare pizza bake pizza cut pizza box returnpizza 真希望這是一個抽象類或者接口 可惜抽象類或接口都不能被實例化 而且 我們有許多種pizza 所以我們增加一些代碼 來確定合適的pizza種類 然后進行制作 修改后的代碼 PizzaorderPizza Stringtype Pizzapizza if type equals cheese pizza newCheesePizza elseif type equals greek pizza newGreekPizza elseif type equals pepperoni pizza newPepperoniPizza pizza prepare pizza bake pizza cut pizza box returnpizza 根據(jù)接受的類型 創(chuàng)建相應(yīng)的pizza實例 并賦值給實例變量 注意 各種pizza實現(xiàn)接口Pizza 傳遞pizza的類型給方法orderPizza 每一種pizza子類型都知道其制作方法 由于市場競爭 其他pizza店推出了新產(chǎn)品 我們也得增加 例如VeggiePizza GreekPizza最近不受歡迎 把它從菜單中取消 于是 改 改 改 PizzaorderPizza Stringtype Pizzapizza if type equals cheese pizza newCheesePizza elseif type equals greek pizza newGreekPizza elseif type equals pepperoni pizza newPepperoniPizza elseif type equals veggie pizza newVeggiePizza pizza prepare pizza bake pizza cut pizza box returnpizza 變與不變 變與不變 PizzaorderPizza Stringtype Pizzapizza if type equals cheese pizza newCheesePizza elseif type equals greek pizza newGreekPizza elseif type equals pepperoni pizza newPepperoniPizza elseif type equals veggie pizza newVeggiePizza pizza prepare pizza bake pizza cut pizza box returnpizza 這是變化的部分 隨著Pizza菜單的變化 這部分要跟著不斷地變 這部分是不變的部分 分離 PizzaorderPizza Stringtype Pizzapizza if type equals cheese pizza newCheesePizza elseif type equals greek pizza newGreekPizza elseif type equals pepperoni pizza newPepperoniPizza elseif type equals veggie pizza newVeggiePizza pizza prepare pizza bake pizza cut pizza box returnpizza 把這部分封裝在一個只管如何創(chuàng)建pizza的對象中 if type equals cheese pizza newCheesePizza elseif type equals greek pizza newGreekPizza elseif type equals pepperoni pizza newPepperoniPizza elseif type equals veggie pizza newVeggiePizza 將創(chuàng)建pizza對象的代碼從orderPizza方法中分離出去 專管制作pizza的對象 我們將專管制作pizza的對象叫做Pizza工廠 PizzaorderPizza Stringtype Pizzapizza pizza prepare pizza bake pizza cut pizza box returnpizza PizzaFactory 要求制作pizza pizza 這樣 orderPizza方法就成為PizaFactory的客戶 Pizza工廠 SimplePizzaFactory publicclassSimplePizzaFactory publicPizzacreatePizza Stringtype Pizzapizza null if type equals cheese pizza newCheesePizza elseif type equals pepperoni pizza newPepperoniPizza elseif type equals veggie pizza newVeggiePizza returnpizza Pizza工廠中定義了 生產(chǎn) pizza的方法 所有客戶都可以用它來實例化新的pizza對象 這部分代碼就是從orderPizza 方法中抽出來的 和原來的方法一樣 也是通過參數(shù)確定pizza的種類 思考一下 這看來好像我們只是把問題從一個對象推給了另一個對象 這樣做有什么好處呢 可以解除客戶代碼 PizzaStore 與具體Pizza的耦合 SimplePizzaFactory可以有許多個客戶 這樣 當實現(xiàn)改變時我們只需要修改SimplePizzaFactory 而不需修改眾多的客戶 提高了聚合度 PizzaStore的職責(zé)是使用pizza對象 SimplePizzaFactory的職責(zé)是決定創(chuàng)建什么樣的pizza對象 重寫PizzaStore類 publicclassPizzaStore SimplePizzaFactoryfactory publicPizzaStore SimplePizzaFactoryfactory this factory factory publicPizzaorderPizza Stringtype Pizzapizza pizza factory createPizza type pizza prepare pizza bake pizza cut pizza box returnpizza othermethodshere 簡單工廠模式 Pizza可以是一個抽象類 也可以是一個接口 框架 框架的對外接口 簡單工廠模式 有人認為這還不是一個真正的模式 只是一種程序設(shè)計的習(xí)慣 授權(quán)pizza店 我們的pizza店非常成功 許多人都想開設(shè)我們的授權(quán)加盟店 但是 不同地區(qū)的加盟pizza店可能希望供應(yīng)不同口味的pizza 怎么解決這個問題呢 解決方法之一 建立不同的工廠 建立不同的工廠 如NYPizzaFactory ChicagoPizzaFactory CaliforniaPizzaFactory 在PizzaStore中包含相應(yīng)工廠的實例 其代碼類似于 該pizza店提供紐約風(fēng)味的pizzaNYPizzaFactorynyFactory newNYPizzaFactory 建立一個生產(chǎn)紐約風(fēng)味pizza的工廠PizzaStorenyStore newPizzaStore nyFactory 建立一個pizza店 引用紐約風(fēng)味pizza的工廠nyStore orderPizza Veggie 生產(chǎn)的是紐約風(fēng)味的pizza 該pizza店提供芝加哥風(fēng)味的pizzaChicagoPizzaFactorychicagoFactory newChicagoPizzaFactory PizzaStorechicagoStore newPizzaStore chicagoFactory chicagoStore orderPizza Veggie 抽象工廠模式 這么多工廠 可以再增加抽象層讓我們一起來設(shè)計 另一種解決方法 工廠方法模式 思路 改寫的PizzaStore 將createPizza 方法放回到PizzaStore 但是聲明為抽象方法 然后 為每一種地方風(fēng)味創(chuàng)建一個PizzaStore的子類 改造后的PizzaStore的代碼 publicabstractclassPizzaStore publicPizzaorderPizza Stringtype Pizzapizza createPizza type pizza prepare pizza bake pizza cut pizza box returnpizza abstractPizzacreatePizza Stringtype 在PizzaStore內(nèi)調(diào)用自身的一個方法來制造pizza 而不是使用一個factory對象 factory對象成了這里的一個抽象方法 下面我們需要PizzaStore的各種子類 對應(yīng)不同的地區(qū)風(fēng)味 讓子類做決定 ChicagoPizzaStore createPizza PizzacreatePizza Stringitem if item equals 奶酪 returnnewNYStyleCheesePizza elseif item equals 蔬菜 returnnewNYStyleVeggiePizza elseif item equals 卡姆 returnnewNYStyleClamPizza elseif item equals 辣香腸 returnnewNYStylePepperoniPizza elsereturnnull 討論 為什么說是由子類做決定的 ChicagoPizzaStore createPizza publicabstractclassPizzaStore publicPizzaorderPizza Stringtype Pizzapizza createPizza type pizza prepare pizza bake pizza cut pizza box returnpizza abstractPizzacreatePizza Stringtype 現(xiàn)在讓我們來編寫子類NYPizzaStore ChicagoPizzaStore createPizza publicclassNYPizzaStoreextendsPizzaStore PizzacreatePizza Stringitem if item equals 奶酪 returnnewNYStyleCheesePizza elseif item equals 蔬菜 returnnewNYStyleVeggiePizza elseif item equals 卡姆 returnnewNYStyleClamPizza elseif item equals 辣香腸 returnnewNYStylePepperoniPizza elsereturnnull 怎么編寫子類ChicagoPizzaStore 試試看 聲明工廠方法 publicabstractclassPizzaStore publicPizzaorderPizza Stringtype Pizzapizza createPizza type pizza prepare pizza bake pizza cut pizza box returnpizza abstractPizzacreatePizza Stringtype 實例化pizza的責(zé)任現(xiàn)在由一個方法承擔(dān) 該方法相當于一個工廠 我們稱之為工廠方法 PizzaStore的子類用createPizza 方法處理對象的實例化 聲明工廠方法 abstractPizzacreatePizza Stringtype abstractProductfactoryMethod Stringtype 工廠方法是抽象的 在一個超類中定義 必須由子類來實現(xiàn) 工廠方法返回一個產(chǎn)品 該產(chǎn)品通常在其所在類的方法中定義 如orderPizza 工廠方法通常提供參數(shù) 用以選擇一個產(chǎn)品的不同品種 工廠方法將客戶 超類中的方法 如PizzaStore中的orderPizza 與具體的產(chǎn)品相隔離 工廠方法怎么工作 假定張三喜歡紐約風(fēng)味的pizza 李四喜歡芝加哥風(fēng)味的pizza 需要相應(yīng)Pizza店的實例調(diào)用orderPizza 訂購想要的pizza品種createPizza 被調(diào)用 并返回pizza到orderPizza 方法 盡管不知道是什么pizza 但orderPizza 仍知道對它進行后續(xù)處理 以張三訂購pizza為例 PizzaStorenyPizzaStore newNYPizzaStore nyPizzaStore orderPizza cheese 在orderPizza 方法中Pizzapizza createPizza cheese 在orderPizza 方法中pizza prepare pizza bake pizza cut pizza box 忘記了產(chǎn)品 pizza 先來個抽象的 importjava util ArrayList publicabstractclassPizza Stringname Stringdough 生面團Stringsauce ArrayListtoppings newArrayList voidprepare System out println Preparing name System out println Tossingdough System out println Addingsauce System out println Addingtoppings for inti 0 i toppings size i System out println toppings get i voidbake System out println Bakefor25minutesat350 voidcut System out println Cuttingthepizzaintodiagonalslices voidbox System out println PlacepizzainofficialPizzaStorebox publicStringgetName returnname 再來個具體的 publicclassNYStyleCheesePizzaextendsPizza publicNYStyleCheesePizza name NYStyleSauceandCheesePizza dough ThinCrustDough sauce MarinaraSauce toppings add GratedReggianoCheese Marinara mariner s sauceisanItalianredsauceusuallymadewithtomatoes garlic herbs suchasbasil andonion 再來個另一風(fēng)味的 publicclassChicagoStyleCheesePizzaextendsPizza publicChicagoStyleCheesePizza name ChicagoStyleDeepDishCheesePizza dough ExtraThickCrustDough sauce PlumTomatoSauce toppings add ShreddedMozzarellaCheese voidcut System out println Cuttingthepizzaintosquareslices 測試主類 publicclassPizzaTestDrive publicstaticvoidmain String args PizzaStorenyStore newNYPizzaStore PizzaStorechicagoStore newChicagoPizzaStore Pizzapizza nyStore orderPizza cheese System out println 張三ordereda pizza getName n pizza chicagoStore orderPizza cheese System out println 李四ordereda pizza getName n 工廠方法模式中的類 創(chuàng)建者類TheCreatorclasses ChicagoPizzaStore createPizza Abstractcreator Concretecreators 工廠方法模式中的類 產(chǎn)品類TheProductclasses Abstractproduct Concreteproducts 工廠方法模式的正式定義 在類中定義一個用于創(chuàng)建對象的接口方法 讓其子類決定實例化哪一個類 通過這種做法 使得工廠方法的客戶 工廠方法的使用者 不必了解具體應(yīng)該實例化哪一個類 如 pizza pizzaStore orderPizza cheese 生產(chǎn)出來的匹薩是紐約風(fēng)味的還是芝加哥風(fēng)味的取決于pizzaStore引用的是哪個PizzaStore的子類 工廠方法模式的結(jié)構(gòu) 總結(jié) FactoryMethod模式 意圖定義一個用于創(chuàng)建對象的接口 讓子類決定實例化哪一個類 工廠方法模式讓一個類的實例化延遲到其子類 使得對象的創(chuàng)建與對象的使用分離開來 別名虛擬構(gòu)造器 工廠方法模式的優(yōu)點與適用場景 優(yōu)點讓用戶代碼與特定類Product的子類ConcretProduct的代碼解耦 用戶不必知道它所使用的對象是怎么創(chuàng)建的 只需要知道這些對象的用法即可 適用場景希望讓用戶使用某些類 但不希望與這些類形成耦合 用new 用戶需要一個類的子類的實例 但不知道該類有哪些子類可用 工廠方法模式的好處 用戶程序只需要和這些類打交道 總結(jié) FactoryMethod 參與者 Product document 定義工廠方法所創(chuàng)建對象的接口 ConcreteProduct mydocument 實現(xiàn)product接口 Creator application 聲明工廠方法可以調(diào)用工廠方法以創(chuàng)建一個product對象ConcreteCreator MyApplication 重新定義工廠方法 以返回一個ConcreteProduct實例 工廠方法的經(jīng)典范例 java迭代器 Collection接口中定義了iterator 方法 所有的集合類都實現(xiàn)了這個方法 iterator 方法就是一個工廠方法 其使用者不必了解需要實例化哪個類 importjava util publicclassShowIterator publicstaticvoidmain String args Listlist Arrays asList newString fountaun rocket tree Iteratoriter list iterator while iter hasNext System out println iter next 抽象工廠解決的問題 抽象工廠模式是避免必須修改所有new調(diào)用問題的一個有效策略 抽象工廠的所有具體化有一個共同的主題 使用工廠來創(chuàng)建實現(xiàn)了已知接口 但類型尚不明確的對象 抽象工廠一般與單例模式聯(lián)系在一起 由單例模式獲得抽象工廠 由抽象工廠制造實際類型未知的產(chǎn)品對象 經(jīng)典例句Imageim Toolkit getDefaultToolkit createImage i 每次調(diào)用getDefaultToolkit 方法得到的是同一個Toolkit實例 createImage 是Toolkit的一個方法 習(xí)題 上機完成 某連鎖超市為留住顧客 決定發(fā)行會員卡 會員卡分為金卡 銀卡 普通卡等多種類型 卡的類型可能還會增加 不論是什么卡 其編號都是統(tǒng)一編制的 即使用同一個編號序列 某軟件公司承接了該項目 設(shè)計人員覺得應(yīng)該將系統(tǒng)設(shè)計的具有一定的通用性 不僅可以較方便的應(yīng)對該連鎖店的需求變化 增減卡的類型 而且可以較容易的修改擴展 為其他公司提供發(fā)卡 卡的風(fēng)格可能不同 服務(wù) 假定你是該軟件公司的設(shè)計師 請你運用學(xué)過的設(shè)計模式設(shè)計該系統(tǒng)的架構(gòu) 編寫實驗報告 要求畫出相應(yīng)的類圖 提供示意性java源程序 實驗報告發(fā)至sam84149

注意事項

本文(java工廠設(shè)計模式.ppt)為本站會員(max****ui)主動上傳,裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。 若此文所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng)(點擊聯(lián)系客服),我們立即給予刪除!

溫馨提示:如果因為網(wǎng)速或其他原因下載失敗請重新下載,重復(fù)下載不扣分。




關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!