




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、-. z.C/C+與設(shè)計模式根底課程設(shè)計模式根底1設(shè)計模式編程根底1.1設(shè)計模式前言模式在一定環(huán)境中解決*一問題的方案,包括三個根本元素-問題,解決方案和環(huán)境。大白話:在一定環(huán)境下,用固定套路解決問題。設(shè)計模式Design pattern是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)歷的總結(jié)。使用設(shè)計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。毫無疑問,設(shè)計模式于己于他人于系統(tǒng)都是多贏的;設(shè)計模式使代碼編制真正工程化;設(shè)計模式是軟件工程的基石脈絡(luò),如同大廈的構(gòu)造一樣。學(xué)習(xí)設(shè)計模式的意義提高職業(yè)素養(yǎng),關(guān)注學(xué)員在行業(yè)的長期開展。我眼中的設(shè)計模式把簡單的問題復(fù)雜化標(biāo)準(zhǔn)化
2、,把環(huán)境中的各個局部進(jìn)展抽象、歸納、解耦合。不是多神秘的東西,我們初學(xué)者也能學(xué)的會。要有信心。學(xué)習(xí)設(shè)計模式的方法對初學(xué)者:積累案例,大于背類圖。初級開發(fā)人員:多思考、多梳理,歸納總結(jié);尊重事物的認(rèn)知規(guī)律,注意事物臨界點的突破。不可急躁。中級開發(fā)人員適宜的開發(fā)環(huán)境,尋找適宜的設(shè)計模式,解決問題。多應(yīng)用對經(jīng)典組合設(shè)計模式的大量、自由的運用。要不斷的追求。設(shè)計模式的分類Gang of Four的Design Patterns: Elements of Resualbel Software書將設(shè)計模式歸納為三大類型,共23種。創(chuàng)立型模式 : 通常和對象的創(chuàng)立有關(guān),涉及到對象實例化的方式。共5種模式)構(gòu)
3、造型模式:描述的是如何組合類和對象以獲得更大的構(gòu)造。(共7種模式)行為型模式:用來對類或?qū)ο笤鯓咏换ズ驮鯓臃峙渎氊?zé)進(jìn)展描述。(共11種模式)創(chuàng)立型模式用來處理對象的創(chuàng)立過程,主要包含以下5種設(shè)計模式:1,工廠方法模式FactoryMethodPattern的用意是定義一個創(chuàng)立產(chǎn)品對象的工廠接口,將實際創(chuàng)立工作推遲到子類中。2,抽象工廠模式AbstractFactoryPattern的意圖是提供一個創(chuàng)立一系列相關(guān)或者相互依賴的接口,而無需指定它們具體的類。3,建造者模式BuilderPattern的意圖是將一個復(fù)雜的構(gòu)建與其表示相別離,使得同樣的構(gòu)建過程可以創(chuàng)立不同的表示。4,原型模式Proto
4、typePattern是用原型實例指定創(chuàng)立對象的種類,并且通過拷貝這些原型創(chuàng)立新的對象。5,單例模式SingletonPattern是保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。構(gòu)造型模式用來處理類或者對象的組合,主要包含以下7種設(shè)計模式:6,代理模式Pro*yPattern就是為其他對象提供一種代理以控制對這個對象的訪問。7,裝飾者模式DecoratorPattern動態(tài)的給一個對象添加一些額外的職責(zé)。就增加功能來說,此模式比生成子類更為靈活。8,適配器模式AdapterPattern是將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口。使得原本由于接口不兼容而不能一起工作的那些類可以一起
5、工作。9,橋接模式BridgePattern是將抽象局部與實際局部別離,使它們都可以獨立的變化。10,組合模式positePattern是將對象組合成樹形構(gòu)造以表示局部-整體的層次構(gòu)造。使得用戶對單個對象和組合對象的使用具有一致性。11,外觀模式FacadePattern是為子系統(tǒng)中的一組接口提供一個一致的界面,此模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。12,享元模式FlyweightPattern是以共享的方式高效的支持大量的細(xì)粒度的對象。行為型模式用來對類或?qū)ο笤鯓咏换ズ驮鯓臃峙渎氊?zé)進(jìn)展描述,主要包含以下11種設(shè)計模式:13,模板方法模式TemplateMethodPa
6、ttern使得子類可以不改變一個算法的構(gòu)造即可重定義該算法的*些特定步驟。14,命令模式mandPattern是將一個請求封裝為一個對象,從而使你可用不同的請求對客戶端進(jìn)展參數(shù)化;對請求排隊或記錄請求日志,以及支持可撤銷的操作。15,責(zé)任鏈模式ChainofResponsibilityPattern,在該模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的*一個對象決定處理此請求,這使得系統(tǒng)可以在不影響客戶端的情況下動態(tài)地重新組織鏈和分配責(zé)任。16,策略模式StrategyPattern就是準(zhǔn)備一組算法,并將每一個算法封裝起來,使得它們可以互換。17,
7、中介者模式MediatorPattern就是定義一個中介對象來封裝系列對象之間的交互。終結(jié)者使各個對象不需要顯示的相互調(diào)用,從而使其耦合性松散,而且可以獨立的改變他們之間的交互。18,觀察者模式ObserverPattern定義對象間的一種一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并被自動更新。19,備忘錄模式MementoPattern是在不破壞封裝的前提下,捕獲一個對象的部狀態(tài),并在該對象之外保存這個狀態(tài)。20,訪問者模式VisitorPattern就是表示一個作用于*對象構(gòu)造中的各元素的操作,它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。
8、21,狀態(tài)模式StatePattern就是對象的行為,依賴于它所處的狀態(tài)。22,解釋器模式InterpreterPattern就是描述了如何為簡單的語言定義一個語法,如何在該語言中表示一個句子,以及如何解釋這些句子。23,迭代器模式IteratorPattern是提供了一種方法順序來訪問一個聚合對象中的各個元素,而又不需要暴露該對象的部表示。1.2設(shè)計模式根本原則最終目的:高聚,低耦合1) 開放封閉原則 (OCP,Open For E*tension, Closed For Modification Principle)類的改動是通過增加代碼進(jìn)展的,而不是修改源代碼。2) 單一職責(zé)原則 (SR
9、P,Single Responsibility Principle)類的職責(zé)要單一,對外只提供一種功能,而引起類變化的原因都應(yīng)該只有一個。3) 依賴倒置原則 (DIP,Dependence Inversion Principle)依賴于抽象(接口),不要依賴具體的實現(xiàn)(類),也就是針對接口編程。4) 接口隔離原則 (ISP,Interface Segegation Principle)不應(yīng)該強(qiáng)迫客戶的程序依賴他們不需要的接口方法。一個接口應(yīng)該只提供一種對外功能,不應(yīng)該把所有操作都封裝到一個接口中去。5) 里氏替換原則 (LSP, Liskov Substitution Principle)任何
10、抽象類出現(xiàn)的地方都可以用他的實現(xiàn)類進(jìn)展替換。實際就是虛擬機(jī)制,語言級別實現(xiàn)面向?qū)ο蠊δ堋?) 優(yōu)先使用組合而不是繼承原則(CARP,posite/Aggregate Reuse Principle)如果使用繼承,會導(dǎo)致父類的任何變換都可能影響到子類的行為。如果使用對象組合,就降低了這種依賴關(guān)系。7) 迪米特法則(LOD,Law of Demeter)一個對象應(yīng)當(dāng)對其他對象盡可能少的了解,從而降低各個對象之間的耦合,提高系統(tǒng)的可維護(hù)性。例如在一個程序中,各個模塊之間相互調(diào)用時,通常會提供一個統(tǒng)一的接口來實現(xiàn)。這樣其他模塊不需要了解另外一個模塊的部實現(xiàn)細(xì)節(jié),這樣當(dāng)一個模塊部的實現(xiàn)發(fā)生改變時,不會影
11、響其他模塊的使用。(黑盒原理)案例圖開閉原則案例依賴倒轉(zhuǎn)12迪米特法則1)和陌生人說話2)不和陌生人說話3) 與依賴倒轉(zhuǎn)原則結(jié)合*人和抽象陌生人說話讓*人和陌生人進(jìn)展解耦合2創(chuàng)立型模式2.1單例模式概念單例模式是一種對象創(chuàng)立型模式,使用單例模式,可以保證為一個類只生成唯一的實例對象。也就是說,在整個程序空間中,該類只存在一個實例對象。GoF對單例模式的定義是:保證一個類、只有一個實例存在,同時提供能對該實例加以訪問的全局訪問方法。為什么使用單例模式在應(yīng)用系統(tǒng)開發(fā)中,我們常常有以下需求:- 在多個線程之間,比方初始化一次socket資源;比方servlet環(huán)境,共享同一個資源或者操作同一個對象-
12、 在整個程序空間使用全局變量,共享資源- 大規(guī)模系統(tǒng)中,為了性能的考慮,需要節(jié)省對象的創(chuàng)立時間等等。因為Singleton模式可以保證為一個類只生成唯一的實例對象,所以這些情況,Singleton模式就派上用場了。實現(xiàn)單例步驟常用步驟構(gòu)造函數(shù)私有化提供一個全局的靜態(tài)方法全局訪問點在類中定義一個靜態(tài)指針,指向本類的變量的靜態(tài)變量指針餓漢式單例和懶漢式單例懶漢式#include using namespace std;/懶漢式class Singeltonprivate:Singelton()m_singer = NULL;m_count = 0;cout 構(gòu)造函數(shù)Singelton . do e
13、ndl;public:static Singelton *getInstance()if (m_singer = NULL ) /懶漢式:1 每次獲取實例都要判斷 2 多線程會有問題m_singer = new Singelton;return m_singer;static void printT()cout m_count: m_count endl;private:static Singelton *m_singer;static int m_count;Singelton *Singelton:m_singer = NULL; /懶漢式并沒有創(chuàng)立單例對象int Singelton:m_
14、count = 0;void main01_1()cout 演示懶漢式 endl;Singelton *p1 = Singelton:getInstance(); /只有在使用的時候,才去創(chuàng)立對象。Singelton *p2 = Singelton:getInstance();if (p1 != p2)cout 不是同一個對象 endl;elsecout 是同一個對象 printT();p2-printT();system(pause);return ;/俄漢式class Singelton2private:Singelton2()m_singer = NULL;m_count = 0;cou
15、t 構(gòu)造函數(shù)Singelton . do endl;public:static Singelton2 *getInstance()/ if (m_singer = NULL )/ / m_singer = new Singelton2;/ return m_singer;static void Singelton2:FreeInstance()if (m_singer != NULL)delete m_singer;m_singer = NULL;m_count = 0;static void printT()cout m_count: m_count endl;private:static
16、Singelton2 *m_singer;static int m_count;Singelton2 *Singelton2:m_singer = new Singelton2; /不管你創(chuàng)立不創(chuàng)立實例,均把實例new出來int Singelton2:m_count = 0;void main()cout 演示餓漢式 endl;Singelton2 *p1 = Singelton2:getInstance(); /只有在使用的時候,才去創(chuàng)立對象。Singelton2 *p2 = Singelton2:getInstance();if (p1 != p2)cout 不是同一個對象 endl;el
17、secout 是同一個對象 printT();p2-printT();Singelton2:FreeInstance();Singelton2:FreeInstance();system(pause);多線程下的懶漢式單例和餓漢式單例/1懶漢模式雖然有優(yōu)點,但是每次調(diào)用GetInstance()靜態(tài)方法時,必須判斷/NULL = m_instance,使程序相對開銷增大。/2多線程中會導(dǎo)致多個實例的產(chǎn)生,從而導(dǎo)致運行代碼不正確以及存的泄露。/3提供釋放資源的函數(shù)討論: 這是因為C+中構(gòu)造函數(shù)并不是線程平安的。 C+中的構(gòu)造函數(shù)簡單來說分兩步:第一步:存分配第二步:初始化成員變量由于多線程的關(guān)系
18、,可能當(dāng)我們在分配存好了以后,還沒來得急初始化成員變量,就進(jìn)展線程切換,另外一個線程拿到所有權(quán)后,由于存已經(jīng)分配了,但是變量初始化還沒進(jìn)展,因此打印成員變量的相關(guān)值會發(fā)生不一致現(xiàn)象。多線程下的懶漢式問題拋出:#include stdaf*.h#include windows.h#include winbase.h#include #include iostreamusing namespace std;class Singeltonprivate:Singelton()count +;coutSingelton構(gòu)造函數(shù)beginnendl;Sleep(1000);coutSingelton構(gòu)造
19、函數(shù)endnendl;private:/防止拷貝構(gòu)造和賦值操作Singelton(const Singelton &obj) ;Singelton& operator=(const Singelton &obj) ;public:static Singelton *getSingelton()/1懶漢模式雖然有優(yōu)點,但是每次調(diào)用GetInstance()靜態(tài)方法時,必須判斷/NULL = m_instance,使程序相對開銷增大。/2多線程中會導(dǎo)致多個實例的產(chǎn)生,從而導(dǎo)致運行代碼不正確以及存的泄露。/3提供釋放資源的函數(shù)return single;static Singelton *relea
20、seSingelton()if (single != NULL) /需要判斷cout釋放資源nendl;delete single;single = NULL;return single;void pirntS() /測試函數(shù)printf(Singelton printS test count:%d n, count);private:static Singelton *single;static int count;/note 靜態(tài)變量類外初始化Singelton *Singelton:single = new Singelton();int Singelton:count = 0;int
21、_tmainTTT(int argc, _TCHAR* argv)Singelton *s1 = Singelton:getSingelton();Singelton *s2 = Singelton:getSingelton();if (s1 = s2)coutok.equalendl;elsecoutnot.equalpirntS();Singelton:releaseSingelton();cout hello.pirntS();return ; int _tmain(int argc, _TCHAR* argv)int i = 0; DWORD dwThreadId201, dwThrd
22、Param = 1;HANDLE hThread201; int threadnum = 3;for (i=0; ithreadnum; i+)/hThreadi = (HANDLE)_beginthreade*( NULL, 0, &threadfunc, NULL, 0,&dwThreadIdi );hThreadi = (HANDLE)_beginthread(&threadfunc, 0 , 0 );if (hThreadi = NULL)printf(begin thread %d error!n, i);break; /等待所有的子線程都運行完畢后,才執(zhí)行這個代碼for (i=0;
23、 ithreadnum; i+)WaitForSingleObject( hThreadi, INFINITE ); printf(等待線程完畢n);for (i=0; ithreadnum; i+)/CloseHandle( hThreadi );Singelton:releaseSingelton();cout hello.printV();/Singelton:getSingelton()-pirntS();void CMy01單例優(yōu)化Dlg:OnBnClickedButton2()int i = 0; DWORD dwThreadId201, dwThrdParam = 1;HANDL
24、E hThread201; int threadnum = 3;for (i=0; ithreadnum; i+)/hThreadi = (HANDLE)_beginthreade*( NULL, 0, &threadfunc, NULL, 0,&dwThreadIdi );hThreadi = (HANDLE)_beginthread(&threadfunc, 0 , 0 );if (hThreadi = NULL)TRACE(begin thread %d error!n, i);break;for (i=0; ithreadnum; i+)WaitForSingleObject( hTh
25、readi, INFINITE );TRACE(等待線程完畢n);for (i=0; ithreadnum; i+)/CloseHandle( hThreadi );/Singelton:releaseSingelton();TRACE(dddddn);程序并發(fā)機(jī)制擴(kuò)展閱讀程序的并發(fā)執(zhí)行往往帶來與時間有關(guān)的錯誤,甚至引發(fā)災(zāi)難性的后果。這需要引入同步機(jī)制。使用多進(jìn)程與多線程時,有時需要協(xié)同兩種或多種動作,此過程就稱同步Synchronization。引入同步機(jī)制的第一個原因是為了控制線程之間的資源同步訪問,因為多個線程在共享資源時如果發(fā)生訪問沖突通常會帶來不正確的后果。例如,一個線程正在更新一個
26、構(gòu)造,同時另一個線程正試圖讀取同一個構(gòu)造。結(jié)果,我們將無法得知所讀取的數(shù)據(jù)是新的還是舊的,或者是二者的混合。第二個原因是有時要求確保線程之間的動作以指定的次序發(fā)生,如一個線程需要等待由另外一個線程所引起的事件。為了在多線程程序中解決同步問題,Windows提供了四種主要的同步對象,每種對象相對于線程有兩種狀態(tài)信號狀態(tài)signal state和非信號狀態(tài)nonsignalstate。當(dāng)相關(guān)聯(lián)的同步對象處于信號狀態(tài)時,線程可以執(zhí)行訪問共享資源,反之必須等待。這四種同步對象是:1事件對象Event。事件對象作為標(biāo)志在線程間傳遞信號。一個或多個線程可等待一個事件對象,當(dāng)指定的事件發(fā)生時,事件對象通知等
27、待線程可以開場執(zhí)行。它有兩種類型:自動重置auto-reset事件和手動重置manual-reset事件。2臨界區(qū)Critical Section。臨界區(qū)對象通過提供一個進(jìn)程所有線程必須共享的對象來控制線程。只有擁有那個對象的線程可以訪問保護(hù)資源。在另一個線程可以訪問該資源之前,前一個線程必須釋放臨界區(qū)對象,以便新的線程可以索取對象的訪問權(quán)。3互斥量Mute* Semaphore。互斥量的工作方式非常類似于臨界區(qū),只是互斥量不僅保護(hù)一個進(jìn)程為多個線程使用的共享資源,而且還可以保護(hù)系統(tǒng)中兩個或多個進(jìn)程之間的的共享資源。4信號量Semaphore。信號量可以允許一個或有限個線程訪問共享資源。它是通
28、過計數(shù)器來實現(xiàn)的,初始化時賦予計數(shù)器以可用資源數(shù),當(dāng)將信號量提供應(yīng)一個線程時,計數(shù)器的值減1,當(dāng)一個線程釋放它時,計數(shù)器值加1。當(dāng)計數(shù)器值小于等于0時,相應(yīng)線程必須等待。信號量是Windows98同步系統(tǒng)的核心。從本質(zhì)上講,互斥量是信號量的一種特殊形式。Windows/NT還提供了另外一種Windows95沒有的同步對象:可等待定時器Waitable Timer。它可以封鎖線程的執(zhí)行,直到到達(dá)*一具體時間。這可以用于后臺任務(wù)。同步問題是多線程編程中最復(fù)雜的問題,后面的linu*系統(tǒng)編程中,還會有更深入的介紹??偨Y(jié)在很多人印象中,單例模式可能是23個設(shè)計模式中最簡單的一個。如果不考慮多線程,的確
29、如此,但是一旦要在多線程中運用,則從我們的教程中可以了解到,它涉及到很多編譯器,多線程,C+語言標(biāo)準(zhǔn)等方面的容。本專題參考的資料如下: 1、C+ Primer (Stanley B.Lippman),主要參考的是模板靜態(tài)變量的初始化以及實例化。 2、 MSDN,有關(guān)線程同步interlocked相關(guān)的知識。 3、Effective C+ 04條款(Scott Meyers) Non-Local-Static對象初始化順序以及Meyers單例模式的實現(xiàn)。 4、Double-Checked Locking,Threads,piler Optimizations,and MoreScott Meye
30、rs,解釋了由于編譯器的優(yōu)化,導(dǎo)致auto_ptr.reset函數(shù)不平安,shared_ptr有類似情況。我們防止使用reset函數(shù)。 5、C+全局和靜態(tài)變量初始化順序的研究(CSDN)。 6、四人幫的經(jīng)典之作:設(shè)計模式 7、windows 核心編程(Jeffrey Richter) 2.2簡單工廠模式什么是簡單工廠模式簡單工廠模式屬于類的創(chuàng)立型模式,又叫做靜態(tài)工廠方法模式。通過專門定義一個類來負(fù)責(zé)創(chuàng)立其他類的實例,被創(chuàng)立的實例通常都具有共同的父類。模式中包含的角色及其職責(zé)1.工廠Creator角色簡單工廠模式的核心,它負(fù)責(zé)實現(xiàn)創(chuàng)立所有實例的部邏輯。工廠類可以被外界直接調(diào)用,創(chuàng)立所需的產(chǎn)品對象
31、。2.抽象Product角色簡單工廠模式所創(chuàng)立的所有對象的父類,它負(fù)責(zé)描述所有實例所共有的公共接口。3.具體產(chǎn)品Concrete Product角色簡單工廠模式所創(chuàng)立的具體實例對象/依賴: 一個類的對象當(dāng)另外一個類的函數(shù)參數(shù)或者是返回值3簡單工廠模式的優(yōu)缺點在這個模式中,工廠類是整個模式的關(guān)鍵所在。它包含必要的判斷邏輯,能夠根據(jù)外界給定的信息,決定終究應(yīng)該創(chuàng)立哪個具體類的對象。用戶在使用時可以直接根據(jù)工廠類去創(chuàng)立所需的實例,而無需了解這些對象是如何創(chuàng)立以及如何組織的。有利于整個軟件體系構(gòu)造的優(yōu)化。不難發(fā)現(xiàn),簡單工廠模式的缺點也正表達(dá)在其工廠類上,由于工廠類集中了所有實例的創(chuàng)立邏輯,所以高聚方面
32、做的并不好。另外,當(dāng)系統(tǒng)中的具體產(chǎn)品類不斷增多時,可能會出現(xiàn)要求工廠類也要做相應(yīng)的修改,擴(kuò)展性并不很好。案例include iostreamusing namespace std;/思想:核心思想是用一個工廠,來根據(jù)輸入的條件產(chǎn)生不同的類,然后根據(jù)不同類的virtual函數(shù)得到不同的結(jié)果。/元素分析:/抽象產(chǎn)品類:水果類/具體的水果了:香蕉類、蘋果類、梨子/優(yōu)點適用于不同情況創(chuàng)立不同的類時/缺點客戶端必須要知道基類和工廠類,耦合性差增加一個產(chǎn)品,需要修改工廠類class Fruitpublic:virtual void getFruit() = 0;protected:private:;cla
33、ss Banana : public Fruitpublic:virtual void getFruit()cout香蕉endl;protected:private:;class Pear : public Fruitpublic:virtual void getFruit()cout梨子endl;protected:private:;class Factory public:static Fruit* Create(char *name)Fruit *tmp = NULL;if (strcmp(name, pear) = 0)tmp = new Pear();else if (strcmp(
34、name, banana) = 0)tmp = new Banana();elsereturn NULL;return tmp;protected:private:;void main41()Fruit *pear = Factory:Create(pear);if (pear = NULL)coutgetFruit();Fruit *banana = Factory:Create(banana);banana-getFruit();system(pause);練習(xí)主要用于創(chuàng)立對象。新添加類時,不會影響以前的系統(tǒng)代碼。核心思想是用一個工廠來根據(jù)輸入的條件產(chǎn)生不同的類,然后根據(jù)不同類的virtu
35、al函數(shù)得到不同的結(jié)果。GOOD:適用于不同情況創(chuàng)立不同的類時BUG:客戶端必須要知道基類和工廠類,耦合性差工廠類與基類為關(guān)聯(lián)關(guān)系#include iostreamusing namespace std;/需求:/模擬四則運算;/用操作符工廠類生產(chǎn)操作符加減乘除, 進(jìn)展結(jié)果運算/運算符抽象類 COperation/加減乘除具體的類(注意含有2個操作數(shù))/工廠類CCalculatorFactory /核心思想用一個工廠來根據(jù)輸入的條件產(chǎn)生不同的類,然后根據(jù)不同類的virtual函數(shù)得到不同的結(jié)果class COperationpublic:int first;int second;public:
36、virtual double GetResult() = 0;private:;class AddOperation : public COperationpublic:double GetResult()return first + second;private:;class SubOperation : public COperationpublic:double GetResult()return first - second;private:;class CCalculatorFactorypublic:static COperation*CreateOperation(char cO
37、perator)COperation * tmp = NULL;switch(cOperator)case +:tmp = new AddOperation();break;case -:tmp = new SubOperation();break;default:tmp = NULL;return tmp;void main()COperation *op1 = CCalculatorFactory:CreateOperation(+);op1-first = 10;op1-second = 20;coutGetResult()first = 10;op2-second = 20;coutG
38、etResult()endl;couthello.n;system(pause);2.3工廠模式概念工廠方法模式同樣屬于類的創(chuàng)立型模式又被稱為多態(tài)工廠模式。工廠方法模式的意義是定義一個創(chuàng)立產(chǎn)品對象的工廠接口,將實際創(chuàng)立工作推遲到子類當(dāng)中。核心工廠類不再負(fù)責(zé)產(chǎn)品的創(chuàng)立,這樣核心類成為一個抽象工廠角色,僅負(fù)責(zé)具體工廠子類必須實現(xiàn)的接口,這樣進(jìn)一步抽象化的好處是使得工廠方法模式可以使系統(tǒng)在不修改具體工廠角色的情況下引進(jìn)新的產(chǎn)品。類圖角色和職責(zé)抽象工廠Creator角色工廠方法模式的核心,任何工廠類都必須實現(xiàn)這個接口。具體工廠 Concrete Creator角色具體工廠類是抽象工廠的一個實現(xiàn),負(fù)責(zé)實
39、例化產(chǎn)品對象。抽象Product角色工廠方法模式所創(chuàng)立的所有對象的父類,它負(fù)責(zé)描述所有實例所共有的公共接口。具體產(chǎn)品Concrete Product角色工廠方法模式所創(chuàng)立的具體實例對象工廠方法模式和簡單工廠模式比擬工廠方法模式與簡單工廠模式在構(gòu)造上的不同不是很明顯。工廠方法類的核心是一個抽象工廠類,而簡單工廠模式把核心放在一個具體類上。工廠方法模式之所以有一個別名叫多態(tài)性工廠模式是因為具體工廠類都有共同的接口,或者有共同的抽象父類。當(dāng)系統(tǒng)擴(kuò)展需要添加新的產(chǎn)品對象時,僅僅需要添加一個具體對象以及一個具體工廠對象,原有工廠對象不需要進(jìn)展任何修改,也不需要修改客戶端,很好的符合了開放封閉原則。而簡單
40、工廠模式在添加新產(chǎn)品對象后不得不修改工廠方法,擴(kuò)展性不好。工廠方法模式退化后可以演變成簡單工廠模式。開放封閉通過添加代碼的方式,不是通過修改代碼的方式完成功能的增強(qiáng)。#include iostreamusing namespace std;class Fruitpublic:virtual void sayname()coutfruitn;class FruitFactorypublic:virtual Fruit* getFruit()return new Fruit();/香蕉class Banana : public Fruitpublic:virtual void sayname()c
41、outBanana nendl;/香蕉工廠class BananaFactory : public FruitFactorypublic:virtual Fruit* getFruit()return new Banana;/蘋果class Apple : public Fruitpublic:virtual void sayname()coutApple ngetFruit();fruit-sayname();delete fruit;delete ff;/2蘋果ff = new AppleFactory();fruit = ff-getFruit();fruit-sayname();del
42、ete fruit;delete ff;couthello.n;system(pause);2.4抽象工廠概念抽象工廠模式是所有形態(tài)的工廠模式中最為抽象和最其一般性的。抽象工廠模式可以向客戶端提供一個接口,使得客戶端在不必指定產(chǎn)品的具體類型的情況下,能夠創(chuàng)立多個產(chǎn)品族的產(chǎn)品對象。產(chǎn)品族和產(chǎn)品等級構(gòu)造備注1:工廠模式:要么生產(chǎn)香蕉、要么生產(chǎn)蘋果、要么生產(chǎn)西紅柿;但是不能同時生產(chǎn)一個產(chǎn)品組。抽象工廠:能同時生產(chǎn)一個產(chǎn)品族。=抽象工廠存在原因解釋:具體工廠在開閉原則下,能生產(chǎn)香蕉/蘋果/梨子; (產(chǎn)品等級構(gòu)造)抽象工廠:在開閉原則下,能生產(chǎn):南方香蕉/蘋果/梨子 (產(chǎn)品族)北方香蕉/蘋果/梨子重要區(qū)
43、別:工廠模式只能生產(chǎn)一個產(chǎn)品。要么香蕉、要么蘋果抽象工廠可以一下生產(chǎn)一個產(chǎn)品族里面有很多產(chǎn)品組成模式中包含的角色及其職責(zé)抽象工廠Creator角色抽象工廠模式的核心,包含對多個產(chǎn)品構(gòu)造的聲明,任何工廠類都必須實現(xiàn)這個接口。具體工廠 Concrete Creator角色具體工廠類是抽象工廠的一個實現(xiàn),負(fù)責(zé)實例化*個產(chǎn)品族中的產(chǎn)品對象。抽象Product角色抽象模式所創(chuàng)立的所有對象的父類,它負(fù)責(zé)描述所有實例所共有的公共接口。具體產(chǎn)品Concrete Product角色抽象模式所創(chuàng)立的具體實例對象案例class Fruitpublic:virtual void sayname()coutfruitn
44、;class FruitFactorypublic:virtual Fruit* getApple()return new Fruit();virtual Fruit* getBanana()return new Fruit();/南方香蕉class SouthBanana : public Fruitpublic:virtual void sayname()coutSouth Banana nendl;/南方蘋果class SouthApple : public Fruitpublic:virtual void sayname()coutSouth Apple nendl;/北方香蕉clas
45、s NorthBanana : public Fruitpublic:virtual void sayname()coutNorth Banana nendl;/北方蘋果class NorthApple : public Fruitpublic:virtual void sayname()coutNorth Apple ngetApple();fruit-sayname();fruit = ff-getBanana();fruit-sayname();delete fruit;delete ff;ff = new NorthFruitFactory();fruit = ff-getApple(
46、);fruit-sayname();fruit = ff-getBanana();fruit-sayname();delete fruit;delete ff;couthello.n;system(pause);2.5建造者模式概念 Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23種設(shè)計模式中的一種。Builder模式是一種對象創(chuàng)立型模式之一,用來隱藏復(fù)合對象的創(chuàng)立過程,它把復(fù)合對象的創(chuàng)立過程加以抽象,通過子類繼承和重載的方式,動態(tài)地創(chuàng)立具有復(fù)合屬性的對象。對象的創(chuàng)立:Builder模式是為對象的創(chuàng)立而設(shè)計的模式- 創(chuàng)立的是一個復(fù)合對象:被創(chuàng)立的對象為一個具有復(fù)合屬性的復(fù)合
47、對象- 關(guān)注對象創(chuàng)立的各局部的創(chuàng)立過程:不同的工廠這里指builder生成器對產(chǎn)品屬性有不同的創(chuàng)立方法角色和職責(zé)1) Builder:為創(chuàng)立產(chǎn)品各個局部,統(tǒng)一抽象接口。2) ConcreteBuilder:具體的創(chuàng)立產(chǎn)品的各個局部,局部A,局部B,局部C。3) Director:構(gòu)造一個使用Builder接口的對象。4) Product:表示被構(gòu)造的復(fù)雜對象。ConcreteBuilder創(chuàng)立該產(chǎn)品的部表示并定義它的裝配過程,包含定義組成部件的類,包括將這些部件裝配成最終產(chǎn)品的接口。適用情況:一個對象的構(gòu)建比擬復(fù)雜,將一個對象的構(gòu)建()和對象的表示()進(jìn)展別離。創(chuàng)立者模式和工廠模式的區(qū)別Fac
48、tory模式中:1、有一個抽象的工廠。2、實現(xiàn)一個具體的工廠-汽車工廠。3、工廠生產(chǎn)汽車A,得到汽車產(chǎn)品A。4、工廠生產(chǎn)汽車B,得到汽車產(chǎn)品B。這樣做,實現(xiàn)了購置者和生產(chǎn)線的隔離。強(qiáng)調(diào)的是結(jié)果。Builder模式:1、引擎工廠生產(chǎn)引擎產(chǎn)品,得到汽車部件A。2、輪胎工廠生產(chǎn)輪子產(chǎn)品,得到汽車部件B。3、底盤工廠生產(chǎn)車身產(chǎn)品,得到汽車部件C。4、將這些部件放到一起,形成剛好能夠組裝成一輛汽車的整體。5、將這個整體送到汽車組裝工廠,得到一個汽車產(chǎn)品。這樣做,目的是為了實現(xiàn)復(fù)雜對象生產(chǎn)線和其部件的解耦。強(qiáng)調(diào)的是過程兩者的區(qū)別在于:Factory模式不考慮對象的組裝過程,而直接生成一個我想要的對象。Bu
49、ilder模式先一個個的創(chuàng)立對象的每一個部件,再統(tǒng)一組裝成一個對象。Factory模式所解決的問題是,工廠生產(chǎn)產(chǎn)品。而Builder模式所解決的問題是工廠控制產(chǎn)品生成器組裝各個部件的過程,然后從產(chǎn)品生成器中得到產(chǎn)品。Builder模式不是很常用。模式本身就是一種思想。知道了就可以了。設(shè)計模式就是一種思想。學(xué)習(xí)一個模式,花上一兩個小時把此模式的意思理解了,就夠了。其精華的所在會在以后工作的設(shè)計中逐漸表達(dá)出來。案例關(guān)鍵字:建公寓工程隊FlatBuild 別墅工程隊 VillaBuild 設(shè)計者Director#include using namespace std;#include stringc
50、lass Housepublic:void setFloor(string floor)this-m_floor = floor;void setWall(string wall)this-m_wall = wall;void setDoor(string door)this-m_door = door;/string getFloor()return m_floor;string setWall()return m_wall;string getDoor()return m_door;protected:private:stringm_floor;stringm_wall;stringm_d
51、oor;class Builderpublic:virtual void makeFloor() = 0;virtual void makeWall() = 0;virtual void makeDoor() = 0;virtual House *GetHouse() = 0;/公寓class FlatBuild : public Builderpublic:FlatBuild()pHouse = new House;virtual void makeFloor()pHouse-setFloor(flat Door);virtual void makeWall()pHouse-setWall(
52、flat Wall);virtual void makeDoor()pHouse-setDoor(flat Door);virtual House *GetHouse()return pHouse;private:House *pHouse;/別墅class VillaBuild : public Builderpublic:VillaBuild()pHouse = new House;virtual void makeFloor()pHouse-setFloor(villa floor);virtual void makeWall()pHouse-setWall(villa Wall);vi
53、rtual void makeDoor()pHouse-setDoor(villa Door);virtual House *GetHouse()return pHouse;private:House *pHouse;class Directorpublic:void Construct(Builder *builder)builder-makeFloor();builder-makeWall();builder-makeDoor();protected:private:;void main()/客戶直接造房子House *pHose = new House;pHose-setDoor(wbm
54、門);pHose-setFloor(wbmFloor);pHose-setWall(wbmWall);delete pHose;/* /工程隊直接造房子Builder *builder = new FlatBuild;builder-makeFloor();builder-makeWall();builder-makeDoor();*/指揮者設(shè)計師指揮工程隊和建房子Director *director = new Director;/建公寓Builder *builder = new FlatBuild;director-Construct(builder); /設(shè)計師指揮工程隊干活House
55、 *house = builder-GetHouse();cout getFloor() Construct(builder); /設(shè)計師指揮工程隊干活house = builder-GetHouse();cout getFloor() m_name = ;this-m_age = 0;m_resume = NULL;JavaProgrammer(string name, int age)this-m_name = name;this-m_age = age;m_resume = NULL;JavaProgrammer()if (m_resume!= NULL)free(m_resume);m
56、_resume = NULL;virtual Person *Clone()JavaProgrammer *p = new JavaProgrammer;*p = *this;return p;void setResume(char *resume)m_resume = new charstrlen(resume) + 1;strcpy(m_resume, resume);virtual void printT()cout m_name: m_name t m_age: m_age endl;if (m_resume != NULL)cout m_resume printT();delete
57、p2;couthello.endl;system(pause);return ;3構(gòu)造型模式3.1代理模式概念Pro*y模式又叫做代理模式,是構(gòu)造型的設(shè)計模式之一,它可以為其他對象提供一種代理Pro*y以控制對這個對象的訪問。所謂代理,是指具有與代理元被代理的對象具有一樣的接口的類,客戶端必須通過代理與被代理的目標(biāo)類交互,而代理一般在交互的過程中交互前后,進(jìn)展*些特別的處理。類圖角色和職責(zé)subject抽象主題角色:真實主題與代理主題的共同接口。RealSubject真實主題角色:定義了代理角色所代表的真實對象。Pro*y代理主題角色:含有對真實主題角色的引用,代理角色通常在將客戶端調(diào)用傳遞給
58、真是主題對象之前或者之后執(zhí)行*些操作,而不是單純返回真實的對象。適合于:為其他對象提供一種代理以控制對這個對象的訪問。提示:a中包含b類;a、b類實現(xiàn)協(xié)議類protocol 理論模板理論模型提示:a中包含b類;a、b類實現(xiàn)協(xié)議類protocol#include #include using namespace std;/定義接口class Interfacepublic:virtual void Request()=0;/真實類class RealClass : public Interfacepublic:virtual void Request()cout真實的請求Request();de
59、lete m_realClass;客戶端:int main()Pro*yClass* test=new Pro*yClass();test-Request();return 0;案例案例2 cocos2d-*中應(yīng)用程序代理類被代理對象,要賣書淘寶、當(dāng)當(dāng)網(wǎng)網(wǎng)上書店,代理對象客戶端通過當(dāng)當(dāng)網(wǎng)進(jìn)展買書。#include using namespace std;/*subject抽象主題角色:真實主題與代理主題的共同接口。RealSubject真實主題角色:定義了代理角色所代表的真實對象。Pro*y代理主題角色:含有對真實主題角色的引用,代理角色通常在將客戶端調(diào)用傳遞給真是主題對象之前或者之后執(zhí)行*些
60、操作,而不是單純返回真實的對象。提示:a中包含b類;a、b類實現(xiàn)協(xié)議類protocol */class Subjectpublic:virtual void SaleBook() = 0;protected:private:;class RealSubject : public Subjectpublic:virtual void SaleBook()cout 實體店買書.n;protected:private:;class Pro*yTaoBao : public Subjectpublic:virtual void SaleBook()/Double11();RealSubject rs;
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 幼兒園實習(xí)老師聘用合同協(xié)議
- 區(qū)域戰(zhàn)略合作框架合同
- 房屋買賣合同補(bǔ)充協(xié)議書
- 企業(yè)短期借款合同協(xié)議
- 裝飾裝修材料供需合同范本
- 廣告公司員工培訓(xùn)合同范本
- 水資源綜合利用工程合同書
- 道路交通事故雙方和解合同書
- 農(nóng)業(yè)觀光園土地租賃合同
- 小學(xué)生每日教育課件
- 物流營銷(第四版) 課件 胡延華 第3、4章 物流目標(biāo)客戶選擇、物流服務(wù)項目開發(fā)
- 拇外翻護(hù)理課件
- 六年級英語教學(xué)隨筆5篇
- (完整版)潔凈室工程師培訓(xùn)教材
- 新概念英語第三冊課后習(xí)題答案詳解
- 寧夏回族自治區(qū)地圖矢量動態(tài)PPT模板(圖文)
- 教育測量與評價第三版PPT完整全套教學(xué)課件
- 中小學(xué)教師教育法律法規(guī)培訓(xùn)PPT頁
- 醫(yī)療器械可用性工程文檔
- 非遺文化介紹推廣課件
- 統(tǒng)編教材四年級下冊語文第二單元教學(xué)解讀及建議1
評論
0/150
提交評論