C++設(shè)計(jì)模式第二講_第1頁(yè)
C++設(shè)計(jì)模式第二講_第2頁(yè)
C++設(shè)計(jì)模式第二講_第3頁(yè)
C++設(shè)計(jì)模式第二講_第4頁(yè)
C++設(shè)計(jì)模式第二講_第5頁(yè)
已閱讀5頁(yè),還剩36頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

《C++設(shè)計(jì)模式教程》第二講:工廠模式主講人:步磊峰UIPower3D界面引擎負(fù)責(zé)人第一節(jié):簡(jiǎn)單工廠模式介紹21、從設(shè)計(jì)模式的類型上來(lái)說(shuō),簡(jiǎn)單工廠模式是屬于創(chuàng)立型模式,又叫做靜態(tài)工廠方法〔StaticFactoryMethod〕模式。

2、但它并不屬于23種GOF設(shè)計(jì)模式之一,之所以在此論述,是為了引出GOF工廠方法模式。3、簡(jiǎn)單工廠模式是由一個(gè)工廠對(duì)象(Factory)決定創(chuàng)立出哪一種產(chǎn)品類(Product)的實(shí)例。4、簡(jiǎn)單工廠模式是工廠模式家族中最簡(jiǎn)單實(shí)用的模式,可以理解為是不同工廠模式的一個(gè)特殊實(shí)現(xiàn)。

第二節(jié):簡(jiǎn)單工廠模式一個(gè)簡(jiǎn)單例子3

第二節(jié):簡(jiǎn)單工廠模式一個(gè)簡(jiǎn)單例子4第二節(jié):簡(jiǎn)單工廠模式一個(gè)簡(jiǎn)單例子5第三節(jié):簡(jiǎn)單工廠描述61、意圖:定義一個(gè)創(chuàng)立對(duì)象的接口,根據(jù)所提供的參數(shù)決定創(chuàng)立出哪個(gè)一個(gè)實(shí)體類的一個(gè)實(shí)例。簡(jiǎn)單工廠模式封裝了對(duì)象的創(chuàng)立過(guò)程。2、別名:靜態(tài)工廠3、結(jié)構(gòu):

第三節(jié):簡(jiǎn)單工廠描述74、動(dòng)機(jī):為了提高內(nèi)聚和松耦合,我們經(jīng)常會(huì)抽象出一些類的公共接口,以形成抽象基類或接口,這樣我們可以聲明一個(gè)指向基類的指針來(lái)指向?qū)嶋H的子類實(shí)現(xiàn),從而到達(dá)多態(tài)的目的。

但這樣容易出現(xiàn)一個(gè)問(wèn)題:大量的子類繼承自抽象基類,我們不得不在每次都要使用到子類的地方編寫(xiě)諸如"newXXX();"的代碼,從而帶來(lái)兩個(gè)問(wèn)題:1)客戶程序員必須知道子類的名字,當(dāng)系統(tǒng)復(fù)雜時(shí),為了處理可能的名字沖突,可能使用不具有很到的可讀性和可記性的名字。2)程序的擴(kuò)展和可維護(hù)性越來(lái)越困難。而這就是簡(jiǎn)單工廠要解決的。通過(guò)定義創(chuàng)立對(duì)象的接口,封裝對(duì)象的創(chuàng)立,與客戶端程序員無(wú)關(guān),增強(qiáng)程序的可擴(kuò)展性及可維護(hù)性。

第三節(jié):簡(jiǎn)單工廠描述85、參與者:1)AbstractProduct定義簡(jiǎn)單工廠方法所創(chuàng)立的產(chǎn)品的接口。2)ConcreteProduct實(shí)現(xiàn)AbstractProduct的接口。3)Factor定義一個(gè)簡(jiǎn)單工廠方法,內(nèi)部創(chuàng)立實(shí)際的ConcreteProduct,并返回基類地址。6、適用:主要運(yùn)用于工具包或框架的開(kāi)發(fā)。

第三節(jié):簡(jiǎn)單工廠的優(yōu)缺點(diǎn)9優(yōu)點(diǎn):工廠類是整個(gè)模式的關(guān)鍵.包含了必要的邏輯判斷,根據(jù)外界給定的信息,決定究竟應(yīng)該創(chuàng)立哪個(gè)具體類的對(duì)象.通過(guò)使用工廠類,外界可以從直接創(chuàng)立具體產(chǎn)品對(duì)象的為難局面擺脫出來(lái),僅僅需要負(fù)責(zé)“消費(fèi)”對(duì)象就可以了。而不必管這些對(duì)象究竟如何創(chuàng)立及如何組織的.明確了各自的職責(zé)和權(quán)利,有利于整個(gè)軟件體系結(jié)構(gòu)的優(yōu)化。缺點(diǎn):由于工廠類集中了所有實(shí)例的創(chuàng)立邏輯,違反了高內(nèi)聚責(zé)任分配原那么,將全部創(chuàng)立邏輯集中到了一個(gè)工廠類中;它所能創(chuàng)立的類只能是事先考慮到的,如果需要添加新的類,那么就需要改變工廠類了。當(dāng)系統(tǒng)中的具體產(chǎn)品類不斷增多時(shí)候,可能會(huì)出現(xiàn)要求工廠類根據(jù)不同條件創(chuàng)立不同實(shí)例的需求.這種對(duì)條件的判斷和對(duì)具體產(chǎn)品類型的判斷交錯(cuò)在一起,很難防止模塊功能的蔓延,對(duì)系統(tǒng)的維護(hù)和擴(kuò)展非常不利;而這些缺點(diǎn)在工廠方法模式中得到了一定的克服。

第四節(jié):工廠方法模式介紹101、工廠方法(FactoryMethod)模式的意義是定義一個(gè)創(chuàng)立產(chǎn)品對(duì)象的工廠接口,將實(shí)際創(chuàng)立工作推遲到子類當(dāng)中。

2、核心工廠類不再負(fù)責(zé)產(chǎn)品的創(chuàng)立,這樣核心類成為一個(gè)抽象工廠角色,僅負(fù)責(zé)具體工廠子類必須實(shí)現(xiàn)的接口。3、這樣進(jìn)一步抽象化的好處是使得工廠方法模式可以使系統(tǒng)在不修改具體工廠角色的情況下引進(jìn)新的產(chǎn)品。。4、工廠方法模式是簡(jiǎn)單工廠模式的衍生,解決了許多簡(jiǎn)單工廠模式的問(wèn)題。1)首先完全實(shí)現(xiàn)‘開(kāi)-閉原那么’,實(shí)現(xiàn)了可擴(kuò)展。2)其次更復(fù)雜的層次結(jié)構(gòu),可以應(yīng)用于產(chǎn)品結(jié)果復(fù)雜的場(chǎng)合。

第五節(jié):改寫(xiě)簡(jiǎn)單工廠模式例子11

第六節(jié):工廠方法描述121、意圖:定義一個(gè)創(chuàng)立對(duì)象的接口,讓子類決定實(shí)例化哪一個(gè)類。工廠方法模式使一個(gè)類的實(shí)例化延遲到其子類。象的創(chuàng)立過(guò)程。2、別名:虛構(gòu)造器(VirtualConstructor)3、結(jié)構(gòu):

第六節(jié):工廠方法描述134、參與者:1)AbstractProduct定義簡(jiǎn)單工廠方法所創(chuàng)立的產(chǎn)品的接口。2)ConcreteProduct實(shí)現(xiàn)AbstractProduct的接口。3)AbstractFactory聲明了一個(gè)工廠方法,該方法返回一個(gè)AbstractProduct對(duì)象。4)ConcreteFactory實(shí)現(xiàn)了基類的方法,內(nèi)部創(chuàng)立對(duì)象的ConcreteProduct,返回的是基類AbstractProduct對(duì)象。

第六節(jié):工廠方法描述145、適用:主要應(yīng)用與兩種情況:第一種情況是對(duì)于某個(gè)產(chǎn)品,調(diào)用者清楚地知道應(yīng)該使用哪個(gè)具體工廠效勞,實(shí)例化該具體工廠,生產(chǎn)出具體的產(chǎn)品來(lái)。第二種情況,只是需要一種產(chǎn)品,而不想知道也不需要知道究竟是哪個(gè)工廠為生產(chǎn)的,即最終選用哪個(gè)具體工廠的決定權(quán)在生產(chǎn)者一方,它們根據(jù)當(dāng)前系統(tǒng)的情況來(lái)實(shí)例化一個(gè)具體的工廠返回給使用者,而這個(gè)決策過(guò)程這對(duì)于使用者來(lái)說(shuō)是透明的。

第七節(jié):返璞歸真15

使用工廠方法雖然進(jìn)行了解耦,使程序更加靈活,但是也帶來(lái)了類膨脹的后果。如果我們使用工廠方法僅僅是為了解決前面提到的簡(jiǎn)單工廠的缺陷,那么我們會(huì)發(fā)現(xiàn)有點(diǎn)小題大做了。C++的模板機(jī)制允許我們使用簡(jiǎn)單工廠的方式來(lái)解決非模板簡(jiǎn)單工廠的缺陷。

第七節(jié):返璞歸真16

代碼演示:

第七節(jié):返璞歸真17

第八節(jié):工廠方法進(jìn)一步應(yīng)用18現(xiàn)在假設(shè)我們要生產(chǎn)一輛組裝車(chē),該車(chē)由引擎,底盤(pán)以及輪子組合而成,在不修改我們前面的代碼的根底上進(jìn)行擴(kuò)展。代碼如下:

第八節(jié):工廠方法進(jìn)一步應(yīng)用19現(xiàn)在假設(shè)我們要生產(chǎn)一輛組裝車(chē),該車(chē)由引擎,底盤(pán)以及輪子組合而成,在不修改我們前面的代碼的根底上進(jìn)行擴(kuò)展。代碼如下:

第八節(jié):工廠方法進(jìn)一步應(yīng)用20現(xiàn)在假設(shè)我們要生產(chǎn)一輛組裝車(chē),該車(chē)由引擎,底盤(pán)以及輪子組合而成,在不修改我們前面的代碼的根底上進(jìn)行擴(kuò)展。代碼如下:

第八節(jié):工廠方法進(jìn)一步應(yīng)用21現(xiàn)在假設(shè)我們要生產(chǎn)一輛組裝車(chē),該車(chē)由引擎,底盤(pán)以及輪子組合而成,在不修改我們前面的代碼的根底上進(jìn)行擴(kuò)展。測(cè)試結(jié)果:

由此可見(jiàn),工廠方法可以用于更加復(fù)雜的對(duì)象創(chuàng)立過(guò)程。耦合性非常的低,易于擴(kuò)展。工廠方法符合了面向?qū)ο笾械拈_(kāi)放-封閉原那么(OCP)。關(guān)于開(kāi)發(fā)封閉原那么,其核心的思想是:

軟件實(shí)體應(yīng)該是可擴(kuò)展,而不可修改的。也就是說(shuō),對(duì)擴(kuò)展是開(kāi)放的,而對(duì)修改是封閉的。第九節(jié):抽象工廠模式的引入22我們繼續(xù)以汽車(chē)生產(chǎn)商生產(chǎn)汽車(chē)的例子來(lái)進(jìn)一步描述抽象工廠模式。前面的例子各個(gè)汽車(chē)廠商僅僅生產(chǎn)一種產(chǎn)品(CarBase)。事實(shí)上我們發(fā)現(xiàn)各個(gè)汽車(chē)廠商生產(chǎn)的產(chǎn)品線非常龐大,單單轎車(chē)(Car)可分為商務(wù)轎車(chē)和跑車(chē)等等。而前面論述的簡(jiǎn)單工廠或工廠方法僅僅只能生產(chǎn)一種產(chǎn)品,如果要生產(chǎn)一系列產(chǎn)品,如何辦呢?這時(shí)候我們就需要引入抽象工廠設(shè)計(jì)模式!

第十節(jié):抽象工廠模式介紹231)當(dāng)每個(gè)抽象產(chǎn)品都有多于一個(gè)的具體子類的時(shí)候,工廠角色怎么知道實(shí)例化哪一個(gè)子類呢?比方每個(gè)抽象產(chǎn)品角色都有兩個(gè)具體產(chǎn)品!2)抽象工廠模式提供兩個(gè)具體工廠角色,分別對(duì)應(yīng)于這兩個(gè)具體產(chǎn)品角色,每一個(gè)具體工廠角色只負(fù)責(zé)某一個(gè)產(chǎn)品角色的實(shí)例化。3)每一個(gè)具體工廠類只負(fù)責(zé)創(chuàng)立抽象產(chǎn)品的某一個(gè)具體子類的實(shí)例。4)每一個(gè)模式都是針對(duì)一定問(wèn)題的解決方案,工廠方法模式針對(duì)的是一個(gè)產(chǎn)品等級(jí)結(jié)構(gòu);而抽象工廠模式針對(duì)的是多個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)(產(chǎn)品族)。第十一節(jié):抽象工廠例子24

第十一節(jié):抽象工廠例子25

第十一節(jié):抽象工廠例子26

第十一節(jié):抽象工廠例子27

第十二節(jié):抽象工廠模式描述281、意圖:提供一個(gè)創(chuàng)立一系列相關(guān)或相互依賴對(duì)象的接口,而書(shū)序指定他們具體的類。2、別名:Kit3、結(jié)構(gòu):

第十二節(jié):抽象工廠模式描述294、參與者:1)AbstractFactory聲明了一系列創(chuàng)立同一層次的不同產(chǎn)品族的抽象方法,這些方法返回所對(duì)應(yīng)的AbstractProduct對(duì)象。2)ConcreteFactory實(shí)現(xiàn)了創(chuàng)立具體產(chǎn)品對(duì)象的操作。2)AbstractProduct為某一類產(chǎn)品聲明了一個(gè)接口。4)ConcreteProduct實(shí)現(xiàn)了AbstractProduct接口。

第十二節(jié):抽象工廠模式描述305、適用:1)系統(tǒng)不依賴于產(chǎn)品類實(shí)例如何被創(chuàng)立,組合和表達(dá)的細(xì)節(jié)。2)系統(tǒng)的產(chǎn)品有多于一個(gè)的產(chǎn)品族,而系統(tǒng)只消費(fèi)其中某一族的產(chǎn)品(抽象工廠模式的原始用意Unix&Windows〕Button--->UnixButton/WinButtonText----->UnixText/WinTextUnix產(chǎn)品族和Windows產(chǎn)品族,不會(huì)同時(shí)使用。GUIFactory--->UnixGUIFactory/WinGUIFactory3)同屬于同一個(gè)產(chǎn)品族是在一起使用的。這一約束必須在系統(tǒng)的設(shè)計(jì)中表達(dá)出來(lái)。4)系統(tǒng)提供一個(gè)產(chǎn)品類的庫(kù),所有產(chǎn)品以同樣的接口出現(xiàn),從而使客戶端不依賴于實(shí)現(xiàn)。

第十二節(jié):抽象工廠模式描述315、優(yōu)缺點(diǎn):1)別離了具體的類。(別離了工廠,別離了產(chǎn)品)2)易于交換產(chǎn)品族(或稱為產(chǎn)品系列)。我們可以進(jìn)行產(chǎn)品配置,例如在win32中使用winGUI控件。在unix下使用UnixGUI控件。3)有利于產(chǎn)品的一致性。(winGUI和UnixGUI控件使用一致的接口,只需更改配置,不需要重新編譯修改)4)難以支持新的產(chǎn)品族(或稱為產(chǎn)品系列)。這是因?yàn)锳bstractFactory接口確定了可以被創(chuàng)立的產(chǎn)品集合。支持新種類的產(chǎn)品就需要擴(kuò)展該工廠接口,這將涉及AbstractFactory類及其所有子類的改變。(只是繁而已,但是能實(shí)現(xiàn))

第十三節(jié):抽象工廠在GUI系統(tǒng)中的經(jīng)典應(yīng)用32

第十四節(jié):對(duì)抽象工廠模式的擴(kuò)展33在前面描述抽象工廠的優(yōu)缺點(diǎn)時(shí),提到了抽象工廠模式的一個(gè)缺點(diǎn):難以支持新的產(chǎn)品族(或稱為產(chǎn)品系列)。這是因?yàn)锳bstractFactory接口確定了可以被創(chuàng)立的產(chǎn)品集合。支持新種類的產(chǎn)品就需要擴(kuò)展該工廠接口,這將涉及AbstractFactory類及其所有子類的改變。(只是繁而已,但是能實(shí)現(xiàn))

還是以工廠生產(chǎn)汽車(chē)為例子,假設(shè)我們現(xiàn)在要增加一種產(chǎn)品族:卡車(chē)。奔馳和寶馬公司都要生產(chǎn)卡車(chē)。那么我們將如何做呢?

第十四節(jié):對(duì)抽象工廠模式的擴(kuò)展341、增加兩個(gè)接口類

第十四節(jié):對(duì)抽象工廠模式的擴(kuò)展352、實(shí)現(xiàn)奔馳和寶馬的卡車(chē)產(chǎn)品

第十四節(jié):對(duì)抽象工廠模式的擴(kuò)展363、實(shí)現(xiàn)擴(kuò)展的奔馳和寶馬的工廠類

第十四節(jié):對(duì)抽象工廠模式的擴(kuò)展374、測(cè)試代碼

由此可見(jiàn),雖然對(duì)抽象工廠擴(kuò)展比較麻煩,但是并非不可能。抽象工廠也符合面向?qū)ο蟮拈_(kāi)放-封閉原那么(OCP)。同時(shí)我們?cè)诔橄蠊S的過(guò)程中又使用了面向?qū)ο蟮牧硗庖粋€(gè)原那么:優(yōu)先使用組合而不是繼承原那么(CARP,Composite/AggregateReusePrinciple)。我們還可以使用單例模式對(duì)抽象工廠進(jìn)一步進(jìn)行封裝。第十五節(jié):面向?qū)ο蟮钠叽笤敲?81)單一職責(zé)原那么(SRP,SingleResponsibilityPrinciple)類的職責(zé)要單一,對(duì)外只提供一種功能,而引起類變化的原因都應(yīng)該只有一個(gè)。2)開(kāi)放封閉原那么(OCP,OpenForExtension,ClosedForModificationPrinciple)類的改動(dòng)是通過(guò)增加代碼進(jìn)行的,而不是修改源代碼。3)依賴倒置原那么(DIP,DependenceInversionPrinciple)依賴于抽象(接口),不要依賴具體的實(shí)現(xiàn)(類),也就是針對(duì)接口編程。4)接口隔離原那么(ISP,InterfaceSegegationPrinciple)不應(yīng)該強(qiáng)迫客戶的程序依賴他們不需要的接口方法。一個(gè)接口應(yīng)該只提供一種對(duì)外功能,不應(yīng)該把所有操作都封裝到一個(gè)接口中去。

最終目的:高內(nèi)聚,低耦合第十五節(jié):面向?qū)ο蟮钠叽笤敲?9

5)里氏替換原那么(LSP,LiskovSubstitutionPrinciple)

溫馨提示

  • 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ù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論