創(chuàng)建型模式_第1頁
已閱讀1頁,還剩100頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、創(chuàng)建型模式,,創(chuàng)建型模式,抽象了實例化過程創(chuàng)建型模式的主旋律將關(guān)于該系統(tǒng)使用那些具體的類的信息封裝起來隱藏了這些類的實例是如何被創(chuàng)建和放在一起的,Context,迷宮的創(chuàng)建Room, Door, Wallenum Direction {North, South, East, West },Room,房間號,,其他MapSite對象的引用,,Wall / Door,Maze,查找特定的Room,,MazeGame : 創(chuàng)建迷宮

2、,1. 存在的問題:不靈活!2. 可能的變化: 增加新的部件, e.g. DoorNeedingSpell3. 改變的最大障礙: 對被實例化的類進行硬編碼,創(chuàng)建型模式提供的實例化方法,Factory MethodCreateMaze調(diào)用虛函數(shù)來創(chuàng)建房間/墻壁/門則可以在MazeGame的子類中重定義這些虛函數(shù),從而改變被實例化的類(房間/墻壁/門)Abstract Factory給CreateMaze

3、傳遞參數(shù)來創(chuàng)建房間/墻壁/門則可以通過傳遞不同的參數(shù)來改變房間/墻壁/門的類,創(chuàng)建型模式提供的實例化方法,Builder傳遞一個對象給CreateMaze該對象使用某些操作(增加房間/墻壁/門),來創(chuàng)建一個新的迷宮則可使用繼承來改變迷宮的一部分或該迷宮被建造的方式PrototypeCreateMaze有多種原型對象(房間/墻壁/門對象)參數(shù)化,其拷貝并將這些對象增加到迷宮中。則可用不同的對象替換這些原型對象以改變迷宮的構(gòu)

4、成Singleton保證一個游戲中僅有一個迷宮游戲中所有對象均可訪問該迷宮不使用全局變量或函數(shù),3.1 Abstract Factory 抽象工程,,Abstract Factory模式,1. 意圖提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需指定它們具體的類。2. 別名 Kit,Abstract Factory模式,3. 動機,Abstract Factory模式,4. 適用性在以下情況可以

5、使用Abstract Factory模式一個系統(tǒng)要獨立于它的產(chǎn)品的創(chuàng)建、組合和表示時。一個系統(tǒng)要由多個產(chǎn)品系列中的一個來配置時。當你要強調(diào)一系列相關(guān)的產(chǎn)品對象的設(shè)計以便進行聯(lián)合使用時。當你提供一個產(chǎn)品類庫,而只想顯示它們的接口而不是實現(xiàn)時。,Abstract Factory模式,5. 結(jié)構(gòu),Abstract Factory模式,6. 參與者AbstractFactory (WidgetFactory)聲明一個創(chuàng)建抽象產(chǎn)品對象

6、的操作接口ConcreteFactory 具體工廠實現(xiàn)創(chuàng)建具體產(chǎn)品對象的操作AbstractProduct (Windows, ScrollBar)為一類產(chǎn)品對象什么一個接口ConcreteProduct 具體產(chǎn)品定義一個將被相應(yīng)的具體工廠創(chuàng)建的產(chǎn)品對象實現(xiàn)AbstractProduct接口Client僅使用“抽象工廠” / “抽象產(chǎn)品” 類聲明的接口,Abstract Factory模式,7. 協(xié)作通常在運行時刻

7、創(chuàng)建一個ConcreteFactory類的實例。這一具體的工廠創(chuàng)建具有特定實現(xiàn)的產(chǎn)品對象。為創(chuàng)建不同的產(chǎn)品對象,客戶應(yīng)使用不同的具體工廠給Client一個抽象工廠指針,指向一個具體工廠對象Client通過工廠獲取抽象產(chǎn)品的指針,指向一個具體產(chǎn)品對象AbstractFactory將產(chǎn)品對象的創(chuàng)建延遲到它的子類(ConcreteFactory),Abstract Factory模式,8. 效果1)分離了具體的類由工廠封裝創(chuàng)建產(chǎn)品

8、對象的職責和過程,從而將客戶與類的實現(xiàn)分離??蛻敉ㄟ^抽象接口操作實例。產(chǎn)品的類名也在具體工廠的實現(xiàn)中被分離;它們不出現(xiàn)在客戶代碼中。,Abstract Factory模式,8. 效果2)使得易于交換產(chǎn)品系列只需改變具體工廠對象,即可使用不同的產(chǎn)品系列。3)有利于產(chǎn)品的一致性一個應(yīng)用一次只能使用同一個系列中的對象。,Abstract Factory模式,8. 效果4)難于支持新種類的產(chǎn)品原因: 在Abstra

9、ctFactory接口中確定了可以被創(chuàng)建的產(chǎn)品集合,Abstract Factory模式,9. 實現(xiàn)1) 將工廠作為單件一般情況下,一個應(yīng)用中每個產(chǎn)品系列只需一個ConcreteFactory的實例使用Singleton模式件具體工廠類的對象唯一化,Abstract Factory模式,9. 實現(xiàn)2) 創(chuàng)建產(chǎn)品具體工廠類的實現(xiàn)方法Factory模式在抽象類中為每個產(chǎn)品定義一個工廠方法在具體類中為每個產(chǎn)品重定義該工廠方法

10、每個產(chǎn)品系列都要有一個新的具體工廠子類Prototype模式具體工廠使用產(chǎn)品系列中每個產(chǎn)品的原型實例來初始化通過復(fù)制它的原型來創(chuàng)建新的產(chǎn)品不是每個產(chǎn)品系列都要有一個新的具體工廠子類,Abstract Factory模式,9. 實現(xiàn)3) 定義可擴展的工廠問題:對每個新產(chǎn)品都要在抽象工廠類中添加新的接口解決方法:用參數(shù)來指定被創(chuàng)建對象的種類AbstractProduct* Make(int id);問題所有產(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、式的實現(xiàn)方式MazeFactory既作為抽象工廠,也作為具體工廠,Abstract Factory模式,12. 相關(guān)應(yīng)用AbstractFactory類通常使用“Factory Method”實現(xiàn),也可以用Prototype實現(xiàn)一個具體的工廠通常是一個單件(Singleton),3.2 Builder 生成器,,Builder模式,1. 意圖 將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可

13、以創(chuàng)建不同的表示。,2. 動機,將RTF文檔轉(zhuǎn)換成多種正文格式,2. 動機,轉(zhuǎn)換器 (Builder,生成器)封裝創(chuàng)建和裝配一個復(fù)雜對象的機制閱讀器(Director,導(dǎo)向器)負責對一個RTF進行語法分析Builder模式將分析文本格式的算法(Director)與描述怎樣創(chuàng)建和表示一個轉(zhuǎn)換后格式的算法(Builder)分離開來。,3. 適用性,當創(chuàng)建復(fù)雜對象的算法應(yīng)該獨立于該對象的組成部分以及它們的裝配方式時。當

14、構(gòu)造過程必須允許被構(gòu)造對象有不同的表示時。,4.結(jié)構(gòu),5. 參與者,Builder (TextConverter)為創(chuàng)建一個Product對象的各個部件指定抽象接口ConcretBuilder實現(xiàn)Builder接口以構(gòu)造和裝配該產(chǎn)品的各個部件定義并明確它所創(chuàng)建的表示提供一個檢索產(chǎn)品的接口 GetResulte.g. GetASCIIText, GetTextWidget,5. 參與者,Director RTFR

15、eader構(gòu)造一個使用Builder接口的對象Product : ASCIIText、TeXText、TextWidget表示被構(gòu)造的復(fù)雜對象。ConcreteBuilder創(chuàng)建該產(chǎn)品的內(nèi)部表示并定義它的裝配過程。包含定義組成部件的類,包括將這些部件裝配成最終產(chǎn)品的接口,6. 協(xié)作,Client創(chuàng)建Director對象,并用Builder對象進行配置。當需要生成產(chǎn)品部件時,Director通知BuilderBuilde

16、r處理Director請求,并將部件添加到產(chǎn)品中Client從Builder中獲取產(chǎn)品,7. 效果,可以改變一個產(chǎn)品的內(nèi)部表示Builder封裝了產(chǎn)品的內(nèi)部表示,與Director分離通過更換Builder來改變產(chǎn)品的內(nèi)部表示將構(gòu)造代碼和表示代碼分開Builder模式通過封裝一個復(fù)雜對象的創(chuàng)建和表示方式提高了對象的模塊性。可對構(gòu)造過程進行更精細的控制在Director控制下一步一步構(gòu)造產(chǎn)品,8. 實現(xiàn),裝配和構(gòu)造接口

17、Builder類接口必須足夠普通,以便滿足ConcreteBuilder的需要簡單情況構(gòu)造請求的結(jié)果是將新的部件添加到產(chǎn)品中復(fù)雜情況需要訪問前面已經(jīng)構(gòu)造的產(chǎn)品部件,8. 實現(xiàn),為什么產(chǎn)品沒有抽象類通常,由ConcreteBuilder生成的產(chǎn)品差異很大與抽象工廠模式不同在Builder中缺省的方法為空在Builder基類中定義空函數(shù),而不是純虛函數(shù)便于在ConcreteBuilder中只需要重定義需要的操作,9. 代

18、碼實例,創(chuàng)建部件,獲取產(chǎn)品,,,,Builder基類,9. 代碼實例,Director,Builder自己并不創(chuàng)建迷宮;它的主要目的僅僅是為創(chuàng)建迷宮定義一個接口,9. 代碼實例,ConcreteBuilder,9. 代碼實例,ConcreteBuilder,9. 代碼實例,Client,9. 代碼實例,另一個ConcreteBuilder不創(chuàng)建迷宮;僅對各種部件進行計數(shù),9. 代碼實例,Client,11. 相關(guān)模式,抽象工廠模式與B

19、uilder模式Builder模式著重于一步步構(gòu)造一個復(fù)雜對象。而抽象工廠著重于多個系列的產(chǎn)品對象。Builder在最后一步返回產(chǎn)品;抽象工廠中,產(chǎn)品是立即返回的Composite通常用Builder生成,3.3 Factory Method工廠方法,,Factory Method模式,1. 意圖定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類Factory Method模式使一個類的實例化延遲到其子類。2. 別

20、名虛構(gòu)造器 Virtual Constructor,3. 動機,基于Application – Document的應(yīng)用框架,將CreateDocument放到子類中解決,4. 使用性,當一個類不知道它所必須創(chuàng)建的對象的類的時候Application不知道要創(chuàng)建的Doc的類當一個類希望由它的子類來指定它所創(chuàng)建的對象的時候Application由MyApplication類來處理當類將職責委托給多個輔助子類中的一個,而且

21、將“具體是哪個輔助子類”的信息局部化。,5. 結(jié)構(gòu),6. 參與者,Product (Document)定義所創(chuàng)建對象的接口ConcreteProduct (MyDocument)實現(xiàn)Product接口Creator (Application)聲明工廠方法,調(diào)用工廠方法以創(chuàng)建一個Product對象ConcreteCreator (MyApplication)重定義工廠方法以返回一個ConcreteProduct實例

22、,7. 協(xié)作,Creator依賴于其子類來定義工廠方法,從而返回一個適當?shù)腃oncreteProduct實例。即: 由子類返回具體的產(chǎn)品對象,8. 效果,從Creator的角度通過工廠方法,不再將與特定應(yīng)用相關(guān)的類綁定到Creator代碼中Creator代碼僅處理Product接口問題:當僅處理一個具體產(chǎn)品時可能僅為創(chuàng)建一個特定的ConcreteProduct對象,而必須創(chuàng)建Creator子類,8. 效果,1)為子類提供掛

23、鉤(hook)用工廠方法在一個類內(nèi)部創(chuàng)建對象通常比直接創(chuàng)建對象更靈活Factory Method給子類一個掛鉤以提供對象的擴展版本,8. 效果,2)連接平行的類層次平行類層次一個類需要將一些職責委托給一個獨立的類,9. 實現(xiàn),1)兩種情況A. Creator是一個抽象類 B. Creator是一個具體類,并為工廠方法提供了一個缺省實現(xiàn),9. 實現(xiàn),2)參數(shù)化工廠方法工廠方法采用一個參數(shù),標識要創(chuàng)建的對象種類,基類,

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. 實現(xiàn),3)特定語言的變化和問題,lazy initialization,9. 實現(xiàn),4)使用模板以避免創(chuàng)建子類,避免僅為一個Product對象而制作新的Creator子類,9. 實現(xiàn),5)命名約定 Class* DoMakeClass(); e.g.

溫馨提示

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

評論

0/150

提交評論