Factory Method 工廠(chǎng)方法_第1頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余9頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、factory method 工廠(chǎng)方法factory method(工廠(chǎng)辦法) factory method(工廠(chǎng)辦法)屬于創(chuàng)建型模式,利用工廠(chǎng)辦法創(chuàng)建對(duì)象實(shí)例而不是挺直用 new 關(guān)鍵字實(shí)例化。 理解如何寫(xiě)出工廠(chǎng)辦法很容易,但理解為什么要用工廠(chǎng)辦法就需要?jiǎng)觿?dòng)腦子了。工廠(chǎng)辦法看似容易的將 new 替換為一個(gè)函數(shù),其實(shí)是體現(xiàn)了面對(duì)接口編程的思路,它創(chuàng)建的對(duì)象其實(shí)是一個(gè)符合通用接口的通用對(duì)象,這個(gè)對(duì)象的詳細(xì)實(shí)現(xiàn)可以任意替換,以達(dá)到通用性目的。 意圖:定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類(lèi)打算實(shí)例化哪一個(gè)類(lèi)。factory method 使一個(gè)類(lèi)的實(shí)例化延遲到其子類(lèi)。 舉例子 假如看不懂上面的意圖介紹,

2、沒(méi)有關(guān)系,設(shè)計(jì)模式需要在日常工作里用起來(lái),結(jié)合例子可以加深你的理解,下面我預(yù)備了三個(gè)例子,讓你體味什么場(chǎng)景下會(huì)用到這種設(shè)計(jì)模式。 換燈泡 我自己在家換過(guò)燈泡,以前我家里燈壞掉的時(shí)候,我看著這個(gè)奇形怪狀的燈管,心里想,這種燈泡和這個(gè)燈座應(yīng)當(dāng)是一體的,市場(chǎng)上估量很難買(mǎi)到適配我這個(gè)燈座的燈泡了。結(jié)果等我把燈泡擰下來(lái),跑到門(mén)口的五金店去換的時(shí)候,店員任憑給了我一個(gè)燈泡,我回去任憑擰了一下竟然就能用了。 我買(mǎi)這個(gè)燈泡的過(guò)程就用到了工廠(chǎng)模式,而正是得益于這種模式,讓我可以便利在家門(mén)口就買(mǎi)到可以用的燈泡。 卡牌對(duì)戰(zhàn)嬉戲 卡牌對(duì)戰(zhàn)中,卡牌有一些基本屬性,比如攻防、生命值,也符合一些通用商定,比如一回合出擊一起

3、等等,那么對(duì)于戰(zhàn)爭(zhēng)系統(tǒng)來(lái)說(shuō),應(yīng)當(dāng)怎樣實(shí)例化卡牌呢?如何批量操作卡牌,而不是通用功能也要拿到每個(gè)卡牌的實(shí)例才干調(diào)用?另外每個(gè)卡牌有特別能力,這些特別能力又應(yīng)當(dāng)如何拓展呢? 實(shí)現(xiàn)隨意圖形拖拽系統(tǒng) 一個(gè)可以被交互操作的圖形,它可以用鼠標(biāo)舉行拉伸、旋轉(zhuǎn)或者移動(dòng),不同圖形實(shí)現(xiàn)這些操作可能并不相同,要存儲(chǔ)的數(shù)據(jù)也不一樣,這些數(shù)據(jù)應(yīng)當(dāng)自立于圖形存儲(chǔ),我們的系統(tǒng)假如要對(duì)接隨意多的圖形,具備強(qiáng)大拓展能力,對(duì)象關(guān)系應(yīng)當(dāng)如何設(shè)計(jì)呢? 意圖說(shuō)明 在用法工廠(chǎng)辦法之前,我們就要?jiǎng)?chuàng)建一個(gè) 用于創(chuàng)建對(duì)象的接口,這個(gè)接口具備通用性,所以我們可以忽視不同的實(shí)現(xiàn)來(lái)做一些通用的事情。 換燈泡的例子來(lái)說(shuō),我去門(mén)口五金店買(mǎi)燈泡,而不是拿

4、到燈泡材料自己 new 一個(gè)出來(lái),就是由于五金店這個(gè) 工廠(chǎng) 提供應(yīng)我的燈泡符合國(guó)家接口標(biāo)準(zhǔn),而我家里的燈座也符合這個(gè)標(biāo)準(zhǔn),所以燈座不需要知道對(duì)接的燈泡是詳細(xì)哪個(gè)實(shí)例,什么色彩,什么外形,這些都無(wú)所謂,只要燈泡符合國(guó)家標(biāo)準(zhǔn)接口,就可以對(duì)接上。 對(duì)卡牌對(duì)戰(zhàn)的系統(tǒng)來(lái)說(shuō),全部卡牌都應(yīng)當(dāng)實(shí)現(xiàn)同一種接口,所以卡牌對(duì)戰(zhàn)系統(tǒng)拿到的卡牌應(yīng)當(dāng)就是容易的 card 類(lèi)型,這種類(lèi)型具備基本的卡片操作交互能力,系統(tǒng)就調(diào)用這些能力完成基本流程就好了,假如系統(tǒng)挺直實(shí)例化詳細(xì)的卡片,那不同的卡片類(lèi)型會(huì)導(dǎo)致系統(tǒng)難以維護(hù),卡片間操作也無(wú)法抽象化。 正式這種模式,使得我們可以在卡牌的詳細(xì)實(shí)現(xiàn)上做一些特別功能,比如修改卡片襲擊時(shí)效果

5、,修改卡牌銷(xiāo)毀時(shí)效果。 對(duì)圖形拖拽系統(tǒng)來(lái)說(shuō),用到了 銜接平行的類(lèi)層次 這個(gè)特性,所謂銜接平行的類(lèi)層次,就是指一個(gè)圖形,與其對(duì)應(yīng)的操作類(lèi)是一個(gè)平行抽象類(lèi),而一個(gè)詳細(xì)的圖形與詳細(xì)的操作類(lèi)則是另一個(gè)平行關(guān)系,系統(tǒng)只要關(guān)注最抽象的 通用圖形類(lèi) 與 通用操作類(lèi) 即可,操作時(shí),底層可能是某個(gè)詳細(xì)的 圓類(lèi) 與 圓操作類(lèi) 結(jié)合用法,詳細(xì)的類(lèi)有不同的實(shí)現(xiàn),但都符合同一種接口,因此操作系統(tǒng)才可以把它們等量齊觀,統(tǒng)一操作。 意圖:定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類(lèi)打算實(shí)例化哪一個(gè)類(lèi)。factory method 使一個(gè)類(lèi)的實(shí)例化延遲到其子類(lèi)。 所以接口是十分重要的,工廠(chǎng)辦法第一句話(huà)就是 定義一個(gè)用于創(chuàng)建對(duì)象的接口,

6、這個(gè)接口就是 creator,讓子類(lèi),也就是詳細(xì)的創(chuàng)建類(lèi)(concretecreator)打算要實(shí)例化哪個(gè)類(lèi)(concreteproduct)。 所謂使一個(gè)類(lèi)的實(shí)例化延遲到其子類(lèi),是由于抽象類(lèi)不知道要實(shí)例化哪個(gè)詳細(xì)類(lèi),所以實(shí)例化動(dòng)作只能由詳細(xì)的子類(lèi)去做,這樣繞一圈的益處是,我們可以將隨意多對(duì)象看作是同一類(lèi)事物,做統(tǒng)一的處理,比如 無(wú)論何種燈泡實(shí)例都滿(mǎn)足通用的燈座接口,全部工廠(chǎng)實(shí)例化的卡牌都具備玩一局卡牌嬉戲的基本功能,任何圖形與交互類(lèi)都滿(mǎn)足特定功能關(guān)系,這種思想讓生活和設(shè)計(jì)得到了大幅簡(jiǎn)化。 結(jié)構(gòu)圖 creator 就是工廠(chǎng)辦法,concretecreator 是實(shí)現(xiàn)了 creator 的詳細(xì)工

7、廠(chǎng)辦法,每一個(gè)詳細(xì)工廠(chǎng)辦法生產(chǎn)一個(gè)詳細(xì)的產(chǎn)品 concreteproduct,每個(gè)詳細(xì)的產(chǎn)品都實(shí)現(xiàn)通用產(chǎn)品的特性 product。 代碼例子 下面例子用法 typescript 編寫(xiě)。 / 產(chǎn)品接口 interface product save: () => void; / 工廠(chǎng)接口 interface creator createproduct: () => product; / 詳細(xì)產(chǎn)品 class concreteproduct implements product save = () => ; / 詳細(xì)工廠(chǎng) class concretecreator implemen

8、ts creator createproduct = () => return new concreteproduct(); ; 創(chuàng)建一個(gè) product 的子類(lèi) concretecreator,并返回一個(gè)實(shí)現(xiàn)了 product 的詳細(xì)實(shí)例 concreteproduct,這樣我們就可以便利用法這個(gè)工廠(chǎng)了。 工廠(chǎng)辦法并不是挺直調(diào)用 new concretecreator().createproduct 那么容易,這樣體現(xiàn)不出任何抽象性,真正的場(chǎng)景是,在一個(gè)創(chuàng)建產(chǎn)品的流程中,我們只知道拿到的工廠(chǎng)是 creator: function main(anycreator: creator) co

9、nst product = anycreator.createproduct() 在外面調(diào)用 main 函數(shù)時(shí),實(shí)際傳進(jìn)去的是一個(gè)詳細(xì)工廠(chǎng),比如 mycreator,但關(guān)鍵是 main 函數(shù)不用關(guān)懷到底是哪一個(gè)詳細(xì)工廠(chǎng),只要知道是個(gè)工廠(chǎng)就行了,詳細(xì)對(duì)象創(chuàng)建過(guò)程交給了其子類(lèi)。 你大概也發(fā)覺(jué)了,這就是抽象工廠(chǎng)中其中的一步,所以抽象工廠(chǎng)用法了工廠(chǎng)辦法。 弊端 工廠(chǎng)辦法中,每創(chuàng)建一種詳細(xì)的子類(lèi),就要寫(xiě)一個(gè)對(duì)應(yīng)的 concretecreate,這相對(duì)照較粗笨,但故意思的是,假如將創(chuàng)建多個(gè)對(duì)象放到一個(gè) concretecreate 中,就變成了 容易工廠(chǎng)模式,新增產(chǎn)品要修改已有類(lèi)不符合開(kāi)閉模式,反而推舉寫(xiě)成本文說(shuō)的這種模式。 彼之毒藥吾之蜜糖,要知道沒(méi)有一種設(shè)計(jì)模式解

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論