版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、創(chuàng)建型模式,,創(chuàng)建型模式,抽象了實(shí)例化過(guò)程創(chuàng)建型模式的主旋律將關(guān)于該系統(tǒng)使用那些具體的類的信息封裝起來(lái)隱藏了這些類的實(shí)例是如何被創(chuàng)建和放在一起的,Context,迷宮的創(chuàng)建Room, Door, Wallenum Direction {North, South, East, West },Room,房間號(hào),,其他MapSite對(duì)象的引用,,Wall / Door,Maze,查找特定的Room,,MazeGame : 創(chuàng)建迷宮
2、,1. 存在的問(wèn)題:不靈活!2. 可能的變化: 增加新的部件, e.g. DoorNeedingSpell3. 改變的最大障礙: 對(duì)被實(shí)例化的類進(jìn)行硬編碼,創(chuàng)建型模式提供的實(shí)例化方法,Factory MethodCreateMaze調(diào)用虛函數(shù)來(lái)創(chuàng)建房間/墻壁/門則可以在MazeGame的子類中重定義這些虛函數(shù),從而改變被實(shí)例化的類(房間/墻壁/門)Abstract Factory給CreateMaze
3、傳遞參數(shù)來(lái)創(chuàng)建房間/墻壁/門則可以通過(guò)傳遞不同的參數(shù)來(lái)改變房間/墻壁/門的類,創(chuàng)建型模式提供的實(shí)例化方法,Builder傳遞一個(gè)對(duì)象給CreateMaze該對(duì)象使用某些操作(增加房間/墻壁/門),來(lái)創(chuàng)建一個(gè)新的迷宮則可使用繼承來(lái)改變迷宮的一部分或該迷宮被建造的方式PrototypeCreateMaze有多種原型對(duì)象(房間/墻壁/門對(duì)象)參數(shù)化,其拷貝并將這些對(duì)象增加到迷宮中。則可用不同的對(duì)象替換這些原型對(duì)象以改變迷宮的構(gòu)
4、成Singleton保證一個(gè)游戲中僅有一個(gè)迷宮游戲中所有對(duì)象均可訪問(wèn)該迷宮不使用全局變量或函數(shù),3.1 Abstract Factory 抽象工程,,Abstract Factory模式,1. 意圖提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無(wú)需指定它們具體的類。2. 別名 Kit,Abstract Factory模式,3. 動(dòng)機(jī),Abstract Factory模式,4. 適用性在以下情況可以
5、使用Abstract Factory模式一個(gè)系統(tǒng)要獨(dú)立于它的產(chǎn)品的創(chuàng)建、組合和表示時(shí)。一個(gè)系統(tǒng)要由多個(gè)產(chǎn)品系列中的一個(gè)來(lái)配置時(shí)。當(dāng)你要強(qiáng)調(diào)一系列相關(guān)的產(chǎn)品對(duì)象的設(shè)計(jì)以便進(jìn)行聯(lián)合使用時(shí)。當(dāng)你提供一個(gè)產(chǎn)品類庫(kù),而只想顯示它們的接口而不是實(shí)現(xiàn)時(shí)。,Abstract Factory模式,5. 結(jié)構(gòu),Abstract Factory模式,6. 參與者AbstractFactory (WidgetFactory)聲明一個(gè)創(chuàng)建抽象產(chǎn)品對(duì)象
6、的操作接口ConcreteFactory 具體工廠實(shí)現(xiàn)創(chuàng)建具體產(chǎn)品對(duì)象的操作AbstractProduct (Windows, ScrollBar)為一類產(chǎn)品對(duì)象什么一個(gè)接口ConcreteProduct 具體產(chǎn)品定義一個(gè)將被相應(yīng)的具體工廠創(chuàng)建的產(chǎn)品對(duì)象實(shí)現(xiàn)AbstractProduct接口Client僅使用“抽象工廠” / “抽象產(chǎn)品” 類聲明的接口,Abstract Factory模式,7. 協(xié)作通常在運(yùn)行時(shí)刻
7、創(chuàng)建一個(gè)ConcreteFactory類的實(shí)例。這一具體的工廠創(chuàng)建具有特定實(shí)現(xiàn)的產(chǎn)品對(duì)象。為創(chuàng)建不同的產(chǎn)品對(duì)象,客戶應(yīng)使用不同的具體工廠給Client一個(gè)抽象工廠指針,指向一個(gè)具體工廠對(duì)象Client通過(guò)工廠獲取抽象產(chǎn)品的指針,指向一個(gè)具體產(chǎn)品對(duì)象AbstractFactory將產(chǎn)品對(duì)象的創(chuàng)建延遲到它的子類(ConcreteFactory),Abstract Factory模式,8. 效果1)分離了具體的類由工廠封裝創(chuàng)建產(chǎn)品
8、對(duì)象的職責(zé)和過(guò)程,從而將客戶與類的實(shí)現(xiàn)分離。客戶通過(guò)抽象接口操作實(shí)例。產(chǎn)品的類名也在具體工廠的實(shí)現(xiàn)中被分離;它們不出現(xiàn)在客戶代碼中。,Abstract Factory模式,8. 效果2)使得易于交換產(chǎn)品系列只需改變具體工廠對(duì)象,即可使用不同的產(chǎn)品系列。3)有利于產(chǎn)品的一致性一個(gè)應(yīng)用一次只能使用同一個(gè)系列中的對(duì)象。,Abstract Factory模式,8. 效果4)難于支持新種類的產(chǎn)品原因: 在Abstra
9、ctFactory接口中確定了可以被創(chuàng)建的產(chǎn)品集合,Abstract Factory模式,9. 實(shí)現(xiàn)1) 將工廠作為單件一般情況下,一個(gè)應(yīng)用中每個(gè)產(chǎn)品系列只需一個(gè)ConcreteFactory的實(shí)例使用Singleton模式件具體工廠類的對(duì)象唯一化,Abstract Factory模式,9. 實(shí)現(xiàn)2) 創(chuàng)建產(chǎn)品具體工廠類的實(shí)現(xiàn)方法Factory模式在抽象類中為每個(gè)產(chǎn)品定義一個(gè)工廠方法在具體類中為每個(gè)產(chǎn)品重定義該工廠方法
10、每個(gè)產(chǎn)品系列都要有一個(gè)新的具體工廠子類Prototype模式具體工廠使用產(chǎn)品系列中每個(gè)產(chǎn)品的原型實(shí)例來(lái)初始化通過(guò)復(fù)制它的原型來(lái)創(chuàng)建新的產(chǎn)品不是每個(gè)產(chǎn)品系列都要有一個(gè)新的具體工廠子類,Abstract Factory模式,9. 實(shí)現(xiàn)3) 定義可擴(kuò)展的工廠問(wèn)題:對(duì)每個(gè)新產(chǎn)品都要在抽象工廠類中添加新的接口解決方法:用參數(shù)來(lái)指定被創(chuàng)建對(duì)象的種類AbstractProduct* Make(int id);問(wèn)題所有產(chǎn)品均是
11、AbstractProduct的子類所有產(chǎn)品以AbstractProduct接口返回可能需要向下類型轉(zhuǎn)換(downcast)e.g. dynamic_cast,Abstract Factory模式,10. 代碼示例,抽象工廠,Client,,,Abstract Factory模式,10. 代碼示例,,具體工廠,,,Client,Abstract Factory模式,10. 代碼示例上例是最通常的Abstract Factory模
12、式的實(shí)現(xiàn)方式MazeFactory既作為抽象工廠,也作為具體工廠,Abstract Factory模式,12. 相關(guān)應(yīng)用AbstractFactory類通常使用“Factory Method”實(shí)現(xiàn),也可以用Prototype實(shí)現(xiàn)一個(gè)具體的工廠通常是一個(gè)單件(Singleton),3.2 Builder 生成器,,Builder模式,1. 意圖 將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可
13、以創(chuàng)建不同的表示。,2. 動(dòng)機(jī),將RTF文檔轉(zhuǎn)換成多種正文格式,2. 動(dòng)機(jī),轉(zhuǎn)換器 (Builder,生成器)封裝創(chuàng)建和裝配一個(gè)復(fù)雜對(duì)象的機(jī)制閱讀器(Director,導(dǎo)向器)負(fù)責(zé)對(duì)一個(gè)RTF進(jìn)行語(yǔ)法分析Builder模式將分析文本格式的算法(Director)與描述怎樣創(chuàng)建和表示一個(gè)轉(zhuǎn)換后格式的算法(Builder)分離開來(lái)。,3. 適用性,當(dāng)創(chuàng)建復(fù)雜對(duì)象的算法應(yīng)該獨(dú)立于該對(duì)象的組成部分以及它們的裝配方式時(shí)。當(dāng)
14、構(gòu)造過(guò)程必須允許被構(gòu)造對(duì)象有不同的表示時(shí)。,4.結(jié)構(gòu),5. 參與者,Builder (TextConverter)為創(chuàng)建一個(gè)Product對(duì)象的各個(gè)部件指定抽象接口ConcretBuilder實(shí)現(xiàn)Builder接口以構(gòu)造和裝配該產(chǎn)品的各個(gè)部件定義并明確它所創(chuàng)建的表示提供一個(gè)檢索產(chǎn)品的接口 GetResulte.g. GetASCIIText, GetTextWidget,5. 參與者,Director RTFR
15、eader構(gòu)造一個(gè)使用Builder接口的對(duì)象Product : ASCIIText、TeXText、TextWidget表示被構(gòu)造的復(fù)雜對(duì)象。ConcreteBuilder創(chuàng)建該產(chǎn)品的內(nèi)部表示并定義它的裝配過(guò)程。包含定義組成部件的類,包括將這些部件裝配成最終產(chǎn)品的接口,6. 協(xié)作,Client創(chuàng)建Director對(duì)象,并用Builder對(duì)象進(jìn)行配置。當(dāng)需要生成產(chǎn)品部件時(shí),Director通知BuilderBuilde
16、r處理Director請(qǐng)求,并將部件添加到產(chǎn)品中Client從Builder中獲取產(chǎn)品,7. 效果,可以改變一個(gè)產(chǎn)品的內(nèi)部表示Builder封裝了產(chǎn)品的內(nèi)部表示,與Director分離通過(guò)更換Builder來(lái)改變產(chǎn)品的內(nèi)部表示將構(gòu)造代碼和表示代碼分開Builder模式通過(guò)封裝一個(gè)復(fù)雜對(duì)象的創(chuàng)建和表示方式提高了對(duì)象的模塊性??蓪?duì)構(gòu)造過(guò)程進(jìn)行更精細(xì)的控制在Director控制下一步一步構(gòu)造產(chǎn)品,8. 實(shí)現(xiàn),裝配和構(gòu)造接口
17、Builder類接口必須足夠普通,以便滿足ConcreteBuilder的需要簡(jiǎn)單情況構(gòu)造請(qǐng)求的結(jié)果是將新的部件添加到產(chǎn)品中復(fù)雜情況需要訪問(wèn)前面已經(jīng)構(gòu)造的產(chǎn)品部件,8. 實(shí)現(xiàn),為什么產(chǎn)品沒(méi)有抽象類通常,由ConcreteBuilder生成的產(chǎn)品差異很大與抽象工廠模式不同在Builder中缺省的方法為空在Builder基類中定義空函數(shù),而不是純虛函數(shù)便于在ConcreteBuilder中只需要重定義需要的操作,9. 代
18、碼實(shí)例,創(chuàng)建部件,獲取產(chǎn)品,,,,Builder基類,9. 代碼實(shí)例,Director,Builder自己并不創(chuàng)建迷宮;它的主要目的僅僅是為創(chuàng)建迷宮定義一個(gè)接口,9. 代碼實(shí)例,ConcreteBuilder,9. 代碼實(shí)例,ConcreteBuilder,9. 代碼實(shí)例,Client,9. 代碼實(shí)例,另一個(gè)ConcreteBuilder不創(chuàng)建迷宮;僅對(duì)各種部件進(jìn)行計(jì)數(shù),9. 代碼實(shí)例,Client,11. 相關(guān)模式,抽象工廠模式與B
19、uilder模式Builder模式著重于一步步構(gòu)造一個(gè)復(fù)雜對(duì)象。而抽象工廠著重于多個(gè)系列的產(chǎn)品對(duì)象。Builder在最后一步返回產(chǎn)品;抽象工廠中,產(chǎn)品是立即返回的Composite通常用Builder生成,3.3 Factory Method工廠方法,,Factory Method模式,1. 意圖定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪一個(gè)類Factory Method模式使一個(gè)類的實(shí)例化延遲到其子類。2. 別
20、名虛構(gòu)造器 Virtual Constructor,3. 動(dòng)機(jī),基于Application – Document的應(yīng)用框架,將CreateDocument放到子類中解決,4. 使用性,當(dāng)一個(gè)類不知道它所必須創(chuàng)建的對(duì)象的類的時(shí)候Application不知道要?jiǎng)?chuàng)建的Doc的類當(dāng)一個(gè)類希望由它的子類來(lái)指定它所創(chuàng)建的對(duì)象的時(shí)候Application由MyApplication類來(lái)處理當(dāng)類將職責(zé)委托給多個(gè)輔助子類中的一個(gè),而且
21、將“具體是哪個(gè)輔助子類”的信息局部化。,5. 結(jié)構(gòu),6. 參與者,Product (Document)定義所創(chuàng)建對(duì)象的接口ConcreteProduct (MyDocument)實(shí)現(xiàn)Product接口Creator (Application)聲明工廠方法,調(diào)用工廠方法以創(chuàng)建一個(gè)Product對(duì)象ConcreteCreator (MyApplication)重定義工廠方法以返回一個(gè)ConcreteProduct實(shí)例
22、,7. 協(xié)作,Creator依賴于其子類來(lái)定義工廠方法,從而返回一個(gè)適當(dāng)?shù)腃oncreteProduct實(shí)例。即: 由子類返回具體的產(chǎn)品對(duì)象,8. 效果,從Creator的角度通過(guò)工廠方法,不再將與特定應(yīng)用相關(guān)的類綁定到Creator代碼中Creator代碼僅處理Product接口問(wèn)題:當(dāng)僅處理一個(gè)具體產(chǎn)品時(shí)可能僅為創(chuàng)建一個(gè)特定的ConcreteProduct對(duì)象,而必須創(chuàng)建Creator子類,8. 效果,1)為子類提供掛
23、鉤(hook)用工廠方法在一個(gè)類內(nèi)部創(chuàng)建對(duì)象通常比直接創(chuàng)建對(duì)象更靈活Factory Method給子類一個(gè)掛鉤以提供對(duì)象的擴(kuò)展版本,8. 效果,2)連接平行的類層次平行類層次一個(gè)類需要將一些職責(zé)委托給一個(gè)獨(dú)立的類,9. 實(shí)現(xiàn),1)兩種情況A. Creator是一個(gè)抽象類 B. Creator是一個(gè)具體類,并為工廠方法提供了一個(gè)缺省實(shí)現(xiàn),9. 實(shí)現(xiàn),2)參數(shù)化工廠方法工廠方法采用一個(gè)參數(shù),標(biāo)識(shí)要?jiǎng)?chuàng)建的對(duì)象種類,基類,
24、Product* MyCreator::Create (ProductId id) { if (id == YOURS) return new MyProduct; if (id == MINE) return new YourProduct; // N.B.: switched YOURS and MINE if (id == THEIRS) return new TheirProduc
25、t; // called if all others fail return Creator::Create(id); },子類,9. 實(shí)現(xiàn),3)特定語(yǔ)言的變化和問(wèn)題,lazy initialization,9. 實(shí)現(xiàn),4)使用模板以避免創(chuàng)建子類,避免僅為一個(gè)Product對(duì)象而制作新的Creator子類,9. 實(shí)現(xiàn),5)命名約定 Class* DoMakeClass(); e.g.
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 09 第9章 創(chuàng)建型模式
- 工學(xué)結(jié)合典型模式初探
- 東德的經(jīng)濟(jì)轉(zhuǎn)型模式與世界其它經(jīng)濟(jì)轉(zhuǎn)型模式的比較.pdf
- 績(jī)效管理幾種典型模式
- 品牌構(gòu)建的原型模式.pdf
- 零售藥店轉(zhuǎn)型模式
- 網(wǎng)點(diǎn)智能化轉(zhuǎn)型模式
- 華夏幸福平臺(tái)型模式持續(xù)創(chuàng)新升級(jí)
- 小妞電影類型模式及特點(diǎn)研究
- 創(chuàng)建者(builder)模式
- 伊春市經(jīng)濟(jì)轉(zhuǎn)型模式研究.pdf
- 阜新市經(jīng)濟(jì)轉(zhuǎn)型模式研究.pdf
- 大關(guān)農(nóng)村能源綜合建設(shè)典型模式
- 廉租住宅套型模式設(shè)計(jì)研究.pdf
- 第4章 結(jié)構(gòu)型模式實(shí)訓(xùn)
- OEM企業(yè)轉(zhuǎn)型模式及其影響因素研究.pdf
- 職業(yè)教育集團(tuán)化辦學(xué)典型模式
- 創(chuàng)建型設(shè)計(jì)模式 培訓(xùn)英文
- 淺析互聯(lián)網(wǎng)金融的幾種典型模式
- oem企業(yè)轉(zhuǎn)型能力與轉(zhuǎn)型模式選擇研究
評(píng)論
0/150
提交評(píng)論