設(shè)計模式復(fù)習(xí)(1)_第1頁
設(shè)計模式復(fù)習(xí)(1)_第2頁
設(shè)計模式復(fù)習(xí)(1)_第3頁
設(shè)計模式復(fù)習(xí)(1)_第4頁
設(shè)計模式復(fù)習(xí)(1)_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、常常 文文 萃萃一、參考書目一、參考書目設(shè)計模式設(shè)計模式(Design Pattern)(Design Pattern)描述了在面向?qū)ο筌浖枋隽嗽诿嫦驅(qū)ο筌浖O(shè)計過程中針對特定問題的簡潔而優(yōu)雅的解決方案,設(shè)計過程中針對特定問題的簡潔而優(yōu)雅的解決方案,是是一套被反復(fù)使用的代碼設(shè)計經(jīng)驗的總結(jié)。使用設(shè)計模式一套被反復(fù)使用的代碼設(shè)計經(jīng)驗的總結(jié)。使用設(shè)計模式是為了可重用代碼、讓代碼更容易被他人理解和保證代是為了可重用代碼、讓代碼更容易被他人理解和保證代碼可靠性。碼可靠性。1.1.根據(jù)根據(jù)目的目的可分為創(chuàng)建型,結(jié)構(gòu)型和行為型三種:可分為創(chuàng)建型,結(jié)構(gòu)型和行為型三種: 創(chuàng)建型創(chuàng)建型模式主要用于創(chuàng)建對象。模式

2、主要用于創(chuàng)建對象。 結(jié)構(gòu)型結(jié)構(gòu)型模式主要用于處理類或?qū)ο蟮慕M合。模式主要用于處理類或?qū)ο蟮慕M合。 行為型行為型模式主要用于描述對類或?qū)ο笤鯓咏换ズ驮鯓幽J街饕糜诿枋鰧︻惢驅(qū)ο笤鯓咏换ズ驮鯓臃峙渎氊?zé)。分配職責(zé)。2.2.根據(jù)根據(jù)范圍范圍,可分為類模式和對象模式兩種:,可分為類模式和對象模式兩種: 類模式類模式處理類和子類之間的關(guān)系,這些關(guān)系通過繼承處理類和子類之間的關(guān)系,這些關(guān)系通過繼承建立,在編譯時刻就被確定下來,是屬于靜態(tài)的。建立,在編譯時刻就被確定下來,是屬于靜態(tài)的。 對象模式對象模式處理對象間的關(guān)系,這些關(guān)系在運行時刻變處理對象間的關(guān)系,這些關(guān)系在運行時刻變化,更具動態(tài)性?;?,更具動態(tài)性

3、。 范圍范圍目的目的創(chuàng)建型模式創(chuàng)建型模式結(jié)構(gòu)型模式結(jié)構(gòu)型模式行為型模式行為型模式類模式類模式工廠方法模式工廠方法模式(類)適配器模式(類)適配器模式解釋器模式解釋器模式模板方法模式模板方法模式對象模式對象模式抽象工廠模式抽象工廠模式建造者模式建造者模式原型模式原型模式單例模式單例模式(對象)適配器模式(對象)適配器模式橋接模式橋接模式組合模式組合模式裝飾模式裝飾模式外觀模式外觀模式享元模式享元模式代理模式代理模式職責(zé)鏈模式職責(zé)鏈模式命令模式命令模式迭代器模式迭代器模式中介者模式中介者模式備忘錄模式備忘錄模式觀察者模式觀察者模式狀態(tài)模式狀態(tài)模式策略模式策略模式訪問者模式訪問者模式設(shè)計原則名稱設(shè)計

4、原則名稱設(shè)計原則簡介設(shè)計原則簡介重要性重要性單一職責(zé)原則單一職責(zé)原則(Single Responsibility Principle, SRP)類的職責(zé)要單一,不能將太多的職責(zé)放在一個類中類的職責(zé)要單一,不能將太多的職責(zé)放在一個類中開閉原則開閉原則(Open-Closed Principle, OCP)軟件實體對擴(kuò)展是開放的,但對修改是關(guān)閉的,即在不修軟件實體對擴(kuò)展是開放的,但對修改是關(guān)閉的,即在不修改一個軟件實體的基礎(chǔ)上去擴(kuò)展其功能改一個軟件實體的基礎(chǔ)上去擴(kuò)展其功能里氏代換原則里氏代換原則(Liskov Substitution Principle, LSP)在軟件系統(tǒng)中,一個可以接受基類對

5、象的地方必然可以接在軟件系統(tǒng)中,一個可以接受基類對象的地方必然可以接受一個子類對象受一個子類對象依賴倒轉(zhuǎn)原則依賴倒轉(zhuǎn)原則(Dependency Inversion Principle, DIP)要針對抽象層編程,而不要針對具體類編程要針對抽象層編程,而不要針對具體類編程接口隔離原則接口隔離原則(Interface Segregation Principle, ISP)使用多個專門的接口來取代一個統(tǒng)一的接口使用多個專門的接口來取代一個統(tǒng)一的接口 合成復(fù)用原則合成復(fù)用原則(Composite Reuse Principle, CRP)在系統(tǒng)中應(yīng)該盡量多使用組合和聚合關(guān)聯(lián)關(guān)系,盡量少使在系統(tǒng)中應(yīng)該盡

6、量多使用組合和聚合關(guān)聯(lián)關(guān)系,盡量少使用甚至不使用繼承關(guān)系用甚至不使用繼承關(guān)系迪米特法則迪米特法則(Law of Demeter, LoD)一個軟件實體對其他實體的引用越少越好,或者說如果兩一個軟件實體對其他實體的引用越少越好,或者說如果兩個類不必彼此直接通信,那么這兩個類就不應(yīng)當(dāng)發(fā)生直接個類不必彼此直接通信,那么這兩個類就不應(yīng)當(dāng)發(fā)生直接的相互作用,而是通過引入一個第三者發(fā)生間接交互的相互作用,而是通過引入一個第三者發(fā)生間接交互合成復(fù)用原則合成復(fù)用原則指在一個新的對象里通過關(guān)聯(lián)關(guān)系(包指在一個新的對象里通過關(guān)聯(lián)關(guān)系(包括組合關(guān)系和聚合關(guān)系)來使用一些已有的對象,使之成為括組合關(guān)系和聚合關(guān)系)來使

7、用一些已有的對象,使之成為新對象的一部分;新對象通過委派調(diào)用已有對象的方法達(dá)到新對象的一部分;新對象通過委派調(diào)用已有對象的方法達(dá)到復(fù)用其已有功能的目的。簡言之:要盡量使用組合復(fù)用其已有功能的目的。簡言之:要盡量使用組合/聚合關(guān)聚合關(guān)系,少用繼承。系,少用繼承。 聚合關(guān)系聚合關(guān)系表示一個整體與部分的關(guān)系。通常在定義一表示一個整體與部分的關(guān)系。通常在定義一個整體類后再去分析這個類的組成結(jié)構(gòu),從而找出一些成個整體類后再去分析這個類的組成結(jié)構(gòu),從而找出一些成員類。該整體類與成員類之間形成了聚合關(guān)系。在聚合關(guān)員類。該整體類與成員類之間形成了聚合關(guān)系。在聚合關(guān)系中,成員類是整體類的一部分,但成員對象可以脫

8、離整系中,成員類是整體類的一部分,但成員對象可以脫離整體對象獨立存在。體對象獨立存在。如汽車發(fā)動機(jī)和汽車是聚合關(guān)系。如汽車發(fā)動機(jī)和汽車是聚合關(guān)系。發(fā)動發(fā)動機(jī)是汽車的組成部分,但可以獨立存在。機(jī)是汽車的組成部分,但可以獨立存在。 組合關(guān)系組合關(guān)系也表示類之間的整體和部分的關(guān)系。但是組也表示類之間的整體和部分的關(guān)系。但是組合關(guān)系中部分和整體具有統(tǒng)一的生存期,一旦整體對象不合關(guān)系中部分和整體具有統(tǒng)一的生存期,一旦整體對象不存在,部分對象也將不存在。即成員類的存在依賴于整體存在,部分對象也將不存在。即成員類的存在依賴于整體類。類。如人的頭與嘴巴之間是組合關(guān)系。如人的頭與嘴巴之間是組合關(guān)系。模式動機(jī)模式

9、動機(jī):只需要知道水果的名字則可得到相應(yīng)的水果:只需要知道水果的名字則可得到相應(yīng)的水果模式定義模式定義:簡單工廠模式專門定義一個類來負(fù)責(zé)創(chuàng)建其他類:簡單工廠模式專門定義一個類來負(fù)責(zé)創(chuàng)建其他類的實例,被創(chuàng)建的實例通常都具有共同的父類。的實例,被創(chuàng)建的實例通常都具有共同的父類。在簡單工廠模式中,可以根據(jù)參數(shù)的不同返回不同類的實例。在簡單工廠模式中,可以根據(jù)參數(shù)的不同返回不同類的實例。三個角色:三個角色:Factory:工廠:工廠Product:抽象產(chǎn)品:抽象產(chǎn)品ConcreteProduct:具體產(chǎn)品:具體產(chǎn)品模式結(jié)構(gòu)模式結(jié)構(gòu)依賴依賴簡單工廠模式的要點在于:當(dāng)你需要創(chuàng)建一個對象時,簡單工廠模式的要點

10、在于:當(dāng)你需要創(chuàng)建一個對象時,只須傳入一個正確的參數(shù),就可以獲取你所需要的對象,只須傳入一個正確的參數(shù),就可以獲取你所需要的對象,而無須知道其創(chuàng)建細(xì)節(jié)。而無須知道其創(chuàng)建細(xì)節(jié)。 模式解析模式解析(提供了專門的工廠類用于創(chuàng)建對象,實現(xiàn)了對責(zé)任提供了專門的工廠類用于創(chuàng)建對象,實現(xiàn)了對責(zé)任的分割:工廠類決定在什么時候創(chuàng)建哪一個產(chǎn)品類的實例,客的分割:工廠類決定在什么時候創(chuàng)建哪一個產(chǎn)品類的實例,客戶端只需要知道具體產(chǎn)品類所對應(yīng)的參數(shù)即可。這種將對象的戶端只需要知道具體產(chǎn)品類所對應(yīng)的參數(shù)即可。這種將對象的創(chuàng)建和對象本身業(yè)務(wù)處理分離的做法降低了系統(tǒng)的耦合度。創(chuàng)建和對象本身業(yè)務(wù)處理分離的做法降低了系統(tǒng)的耦合度

11、。()通過引入配置文件,可以在不修改任何客戶端代碼)通過引入配置文件,可以在不修改任何客戶端代碼的情況下更換和增加新的具體產(chǎn)品類,提高了系統(tǒng)的靈活性。的情況下更換和增加新的具體產(chǎn)品類,提高了系統(tǒng)的靈活性。缺點:缺點:(工廠類的職責(zé)相對過重,增加新的產(chǎn)品需要修工廠類的職責(zé)相對過重,增加新的產(chǎn)品需要修改工廠類的判斷邏輯,這一點與開閉原則相違背。改工廠類的判斷邏輯,這一點與開閉原則相違背。系統(tǒng)擴(kuò)展困難,一旦添加新產(chǎn)品就不得不修改工廠邏輯,系統(tǒng)擴(kuò)展困難,一旦添加新產(chǎn)品就不得不修改工廠邏輯,不利于系統(tǒng)的擴(kuò)展和維護(hù)。不利于系統(tǒng)的擴(kuò)展和維護(hù)。(使用簡單工廠模式會增加類的個數(shù),從而增加使用簡單工廠模式會增加類

12、的個數(shù),從而增加了系統(tǒng)復(fù)雜度。了系統(tǒng)復(fù)雜度。模式定義模式定義:工廠方法模式定義一個用于創(chuàng)建對象的接口,讓:工廠方法模式定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。子類決定實例化哪一個類。 在工廠方法模式中,工廠父類負(fù)責(zé)定義創(chuàng)建產(chǎn)品對象的在工廠方法模式中,工廠父類負(fù)責(zé)定義創(chuàng)建產(chǎn)品對象的公共接口,而工廠子類則負(fù)責(zé)生成具體的產(chǎn)品對象,這樣做公共接口,而工廠子類則負(fù)責(zé)生成具體的產(chǎn)品對象,這樣做的目的是將的目的是將產(chǎn)品類的實例化操作延遲到工廠子類中完成產(chǎn)品類的實例化操作延遲到工廠子類中完成,即,即通過工廠子類來確定究竟應(yīng)該實例化哪一個具體產(chǎn)品類。通過工廠子類來確定究竟應(yīng)該實例化哪一個具體產(chǎn)品類

13、。Product:抽象產(chǎn)品:抽象產(chǎn)品 ConcreteProduct:具體產(chǎn)品:具體產(chǎn)品Factory:抽象工廠:抽象工廠 ConcreteFactory:具體工廠:具體工廠模式結(jié)構(gòu)模式結(jié)構(gòu)模式舉例模式舉例工廠方法實現(xiàn)的計算器工廠方法實現(xiàn)的計算器(P69-70)模式解析模式解析工廠方法模式是簡單工廠模式的進(jìn)一步抽象和推廣。保持了簡工廠方法模式是簡單工廠模式的進(jìn)一步抽象和推廣。保持了簡單工廠模式的優(yōu)點而克服了其缺點。單工廠模式的優(yōu)點而克服了其缺點。在工廠方法模式中,核心的工廠類不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,在工廠方法模式中,核心的工廠類不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建工作交給子類去做。這個核心類

14、僅僅負(fù)責(zé)給出具體而是將具體創(chuàng)建工作交給子類去做。這個核心類僅僅負(fù)責(zé)給出具體工廠必須實現(xiàn)的接口,使得工廠方法模式可以允許系統(tǒng)在不修改工工廠必須實現(xiàn)的接口,使得工廠方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引進(jìn)新產(chǎn)品。廠角色的情況下引進(jìn)新產(chǎn)品。 當(dāng)需要添加新的產(chǎn)品對象時,僅僅需要添加一個具體產(chǎn)品對象當(dāng)需要添加新的產(chǎn)品對象時,僅僅需要添加一個具體產(chǎn)品對象以及一個具體工廠對象,原有工廠對象不需要進(jìn)行任何修改,也不以及一個具體工廠對象,原有工廠對象不需要進(jìn)行任何修改,也不需要修改客戶端,很好地符合了需要修改客戶端,很好地符合了“開閉原則開閉原則”。優(yōu)點:優(yōu)點:工廠方法用來創(chuàng)建客戶所需要的產(chǎn)品,同時向客

15、戶隱藏了哪種工廠方法用來創(chuàng)建客戶所需要的產(chǎn)品,同時向客戶隱藏了哪種具體產(chǎn)品類將被實例化的細(xì)節(jié),用戶只需要關(guān)心所需產(chǎn)品對應(yīng)具體產(chǎn)品類將被實例化的細(xì)節(jié),用戶只需要關(guān)心所需產(chǎn)品對應(yīng)的工廠,無須關(guān)心創(chuàng)建細(xì)節(jié),甚至無須知道具體產(chǎn)品類的類名。的工廠,無須關(guān)心創(chuàng)建細(xì)節(jié),甚至無須知道具體產(chǎn)品類的類名。在系統(tǒng)中加入新產(chǎn)品只要添加一個具體工廠和具體產(chǎn)品就可以。在系統(tǒng)中加入新產(chǎn)品只要添加一個具體工廠和具體產(chǎn)品就可以。系統(tǒng)的可擴(kuò)展性非常好,完全符合系統(tǒng)的可擴(kuò)展性非常好,完全符合“開閉原則開閉原則”。缺點:缺點:在添加新產(chǎn)品時需要編寫新的具體產(chǎn)品類,而且還要提供與之在添加新產(chǎn)品時需要編寫新的具體產(chǎn)品類,而且還要提供與之

16、對應(yīng)的具體工廠類,系統(tǒng)中對應(yīng)的具體工廠類,系統(tǒng)中類的個數(shù)將成對增加類的個數(shù)將成對增加,增加了系統(tǒng),增加了系統(tǒng)的復(fù)雜度,更多的類需要編譯和運行給系統(tǒng)帶來額外開銷。的復(fù)雜度,更多的類需要編譯和運行給系統(tǒng)帶來額外開銷。由于考慮到系統(tǒng)的可擴(kuò)展性,需要引入抽象層,在客戶端代碼由于考慮到系統(tǒng)的可擴(kuò)展性,需要引入抽象層,在客戶端代碼中均使用抽象層進(jìn)行定義,中均使用抽象層進(jìn)行定義,增加了系統(tǒng)的抽象性和理解難度增加了系統(tǒng)的抽象性和理解難度,且在實現(xiàn)時可能需要用到且在實現(xiàn)時可能需要用到DOM、反射等技術(shù),增加了系統(tǒng)的實、反射等技術(shù),增加了系統(tǒng)的實現(xiàn)難度?,F(xiàn)難度。在工廠方法模式中只負(fù)責(zé)生產(chǎn)一類產(chǎn)品,每一個具體工廠在

17、工廠方法模式中只負(fù)責(zé)生產(chǎn)一類產(chǎn)品,每一個具體工廠對應(yīng)一種具體產(chǎn)品。對應(yīng)一種具體產(chǎn)品。但是有時候我們需要一個工廠可以提但是有時候我們需要一個工廠可以提供多個產(chǎn)品對象,而供多個產(chǎn)品對象,而不是單一的產(chǎn)品對象。不是單一的產(chǎn)品對象。例:農(nóng)場系統(tǒng)例:農(nóng)場系統(tǒng)兩種抽象產(chǎn)品:水果、蔬菜兩種抽象產(chǎn)品:水果、蔬菜四種具體產(chǎn)品:北方水果,熱帶水果,北方蔬菜,熱帶蔬菜四種具體產(chǎn)品:北方水果,熱帶水果,北方蔬菜,熱帶蔬菜 兩個相關(guān)概念兩個相關(guān)概念()產(chǎn)品等級結(jié)構(gòu)()產(chǎn)品等級結(jié)構(gòu)產(chǎn)品等級結(jié)構(gòu)即產(chǎn)品的繼承結(jié)構(gòu),如一個抽象類是電視機(jī),其產(chǎn)品等級結(jié)構(gòu)即產(chǎn)品的繼承結(jié)構(gòu),如一個抽象類是電視機(jī),其子類有海爾電視機(jī)、海信電視機(jī)、子類

18、有海爾電視機(jī)、海信電視機(jī)、TCL電視機(jī),則抽象電視機(jī)與具電視機(jī),則抽象電視機(jī)與具體品牌的電視機(jī)之間構(gòu)成了一個產(chǎn)品等級結(jié)構(gòu),抽象電視機(jī)是父類,體品牌的電視機(jī)之間構(gòu)成了一個產(chǎn)品等級結(jié)構(gòu),抽象電視機(jī)是父類,而具體品牌的電視機(jī)是其子類。而具體品牌的電視機(jī)是其子類。()產(chǎn)品族()產(chǎn)品族在抽象工廠模式中,產(chǎn)品族是指由同一個工廠生產(chǎn)的,位于不在抽象工廠模式中,產(chǎn)品族是指由同一個工廠生產(chǎn)的,位于不同產(chǎn)品等級結(jié)構(gòu)中的一組產(chǎn)品,如海爾電器工廠生產(chǎn)的海爾電視機(jī)、同產(chǎn)品等級結(jié)構(gòu)中的一組產(chǎn)品,如海爾電器工廠生產(chǎn)的海爾電視機(jī)、海爾電冰箱,海爾電視機(jī)位于電視機(jī)產(chǎn)品等級結(jié)構(gòu)中,海爾電冰箱海爾電冰箱,海爾電視機(jī)位于電視機(jī)產(chǎn)品等

19、級結(jié)構(gòu)中,海爾電冰箱位于電冰箱產(chǎn)品等級結(jié)構(gòu)中。位于電冰箱產(chǎn)品等級結(jié)構(gòu)中。 模式定義模式定義 抽象工廠模式抽象工廠模式(Abstract Factory Pattern):提供一個創(chuàng)建一系列相提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無須指定它們具體的類。關(guān)或相互依賴對象的接口,而無須指定它們具體的類。 模式解析模式解析抽象工廠模式是所有形式的工廠模式中最為抽象和最具一般性的抽象工廠模式是所有形式的工廠模式中最為抽象和最具一般性的一種形態(tài)。抽象工廠模式與工廠方法模式最大的區(qū)別在于,工廠方一種形態(tài)。抽象工廠模式與工廠方法模式最大的區(qū)別在于,工廠方法模式針對的是一個產(chǎn)品等級結(jié)構(gòu),而抽象工廠模式則

20、需要面對多法模式針對的是一個產(chǎn)品等級結(jié)構(gòu),而抽象工廠模式則需要面對多個產(chǎn)品等級結(jié)構(gòu)。個產(chǎn)品等級結(jié)構(gòu)。當(dāng)系統(tǒng)所提供的工廠所需生產(chǎn)的具體產(chǎn)品并不是一個簡單的對象,當(dāng)系統(tǒng)所提供的工廠所需生產(chǎn)的具體產(chǎn)品并不是一個簡單的對象,而是多個位于不同產(chǎn)品等級結(jié)構(gòu)中屬于不同類型的具體產(chǎn)品時需要而是多個位于不同產(chǎn)品等級結(jié)構(gòu)中屬于不同類型的具體產(chǎn)品時需要使用抽象工廠模式。使用抽象工廠模式。 基本代碼基本代碼using System;using System.Collections.Generic;using System.Text;namespace 抽象工廠模式抽象工廠模式 class Program static

21、 void Main(string args) AbstractFactory factory1 = new ConcreteFactory1(); Client c1 = new Client(factory1); c1.Run(); AbstractFactory factory2 = new ConcreteFactory2(); Client c2 = new Client(factory2); c2.Run(); Console.Read(); abstract class AbstractFactory public abstract AbstractProductA Create

22、ProductA(); public abstract AbstractProductB CreateProductB(); class ConcreteFactory1 : AbstractFactory public override AbstractProductA CreateProductA() return new ProductA1(); public override AbstractProductB CreateProductB() return new ProductB1(); class ConcreteFactory2 : AbstractFactory public

23、override AbstractProductA CreateProductA() return new ProductA2(); public override AbstractProductB CreateProductB() return new ProductB2(); abstract class AbstractProductA abstract class AbstractProductB public abstract void Interact(AbstractProductA a); class ProductA1 : AbstractProductA class Pro

24、ductB1 : AbstractProductB public override void Interact(AbstractProductA a) Console.WriteLine(this.GetType().Name + interacts with + a.GetType().Name); class ProductA2 : AbstractProductA class ProductB2 : AbstractProductB public override void Interact(AbstractProductA a) Console.WriteLine(this.GetTy

25、pe().Name + interacts with + a.GetType().Name); class Client private AbstractProductA AbstractProductA; private AbstractProductB AbstractProductB; / Constructor public Client(AbstractFactory factory) AbstractProductB = factory.CreateProductB(); AbstractProductA = factory.CreateProductA(); public voi

26、d Run() AbstractProductB.Interact(AbstractProductA); 汽車包括車輪、方向盤、發(fā)送機(jī)等各種汽車包括車輪、方向盤、發(fā)送機(jī)等各種部件。用戶只需要指定汽車的類型就可部件。用戶只需要指定汽車的類型就可以得到一輛完整的汽車。以得到一輛完整的汽車。在軟件開發(fā)中,也存在大量類似汽車一樣的復(fù)雜對象,在軟件開發(fā)中,也存在大量類似汽車一樣的復(fù)雜對象,相當(dāng)于一輛有待建造的汽車,而對象的屬性相當(dāng)于汽車的相當(dāng)于一輛有待建造的汽車,而對象的屬性相當(dāng)于汽車的部件,建造產(chǎn)品的過程就相當(dāng)于組合部件的過程。由于組部件,建造產(chǎn)品的過程就相當(dāng)于組合部件的過程。由于組合部件的過程很復(fù)雜

27、,因此,這些部件的組合過程往往被合部件的過程很復(fù)雜,因此,這些部件的組合過程往往被“外部化外部化”到一個稱作建造者的對象里,建造者呈現(xiàn)給客到一個稱作建造者的對象里,建造者呈現(xiàn)給客戶端的是一個已經(jīng)建造完畢的完整產(chǎn)品對象,而用戶無須戶端的是一個已經(jīng)建造完畢的完整產(chǎn)品對象,而用戶無須關(guān)心該對象所包含的屬性以及它們的組裝方式。關(guān)心該對象所包含的屬性以及它們的組裝方式。 Builder:抽象建造者:抽象建造者ConcreteBuilder:具體建造者:具體建造者Director:指揮者:指揮者Product:產(chǎn)品角色:產(chǎn)品角色建造者模式的結(jié)構(gòu)中引入了一個指揮者類建造者模式的結(jié)構(gòu)中引入了一個指揮者類Dir

28、ector,該類,該類的作用主要有兩個:的作用主要有兩個:一方面一方面隔離了客戶與生產(chǎn)過程隔離了客戶與生產(chǎn)過程;另一方面另一方面負(fù)責(zé)控制產(chǎn)品的生成過程負(fù)責(zé)控制產(chǎn)品的生成過程。指揮者針對抽象建造者編程,客戶端只需要知道具體建指揮者針對抽象建造者編程,客戶端只需要知道具體建造者的類型,即可通過指揮者類調(diào)用建造者的相關(guān)方法,返造者的類型,即可通過指揮者類調(diào)用建造者的相關(guān)方法,返回一個完整的產(chǎn)品對象?;匾粋€完整的產(chǎn)品對象。 在建造者模式中,客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié),將在建造者模式中,客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié),將產(chǎn)品本身與產(chǎn)品的創(chuàng)建過程解耦,使得相同的創(chuàng)建過程可以產(chǎn)品本身與產(chǎn)品的創(chuàng)建過程

29、解耦,使得相同的創(chuàng)建過程可以創(chuàng)建不同的產(chǎn)品對象。創(chuàng)建不同的產(chǎn)品對象。 每一個具體建造者都相對獨立,而與其他的具體建造者無關(guān),每一個具體建造者都相對獨立,而與其他的具體建造者無關(guān),因此可以很方便地替換具體建造者或增加新的具體建造者,因此可以很方便地替換具體建造者或增加新的具體建造者,用戶使用不同的具體建造者即可得到不同的產(chǎn)品對象。用戶使用不同的具體建造者即可得到不同的產(chǎn)品對象。 可以更加精細(xì)地控制產(chǎn)品的創(chuàng)建過程。將復(fù)雜產(chǎn)品的創(chuàng)建步可以更加精細(xì)地控制產(chǎn)品的創(chuàng)建過程。將復(fù)雜產(chǎn)品的創(chuàng)建步驟分解在不同的方法中,使得創(chuàng)建過程更加清晰,也更方便驟分解在不同的方法中,使得創(chuàng)建過程更加清晰,也更方便使用程序來控

30、制創(chuàng)建過程。使用程序來控制創(chuàng)建過程。 增加新的具體建造者無須修改原有類庫的代碼,指揮者類針增加新的具體建造者無須修改原有類庫的代碼,指揮者類針對抽象建造者類編程,系統(tǒng)擴(kuò)展方便,符合對抽象建造者類編程,系統(tǒng)擴(kuò)展方便,符合“開閉原則開閉原則”。 建造者模式所創(chuàng)建的產(chǎn)品一般具有較多的共同點,其組建造者模式所創(chuàng)建的產(chǎn)品一般具有較多的共同點,其組成部分相似,如果產(chǎn)品之間的差異性很大,則不適合使成部分相似,如果產(chǎn)品之間的差異性很大,則不適合使用建造者模式,因此其使用范圍受到一定的限制。用建造者模式,因此其使用范圍受到一定的限制。 如果產(chǎn)品的內(nèi)部變化復(fù)雜,可能會導(dǎo)致需要定義很多具如果產(chǎn)品的內(nèi)部變化復(fù)雜,可能

31、會導(dǎo)致需要定義很多具體建造者類來實現(xiàn)這種變化,導(dǎo)致系統(tǒng)變得很龐大。體建造者類來實現(xiàn)這種變化,導(dǎo)致系統(tǒng)變得很龐大。在軟件系統(tǒng)中,有些對象的創(chuàng)建過程較為復(fù)雜,而且在軟件系統(tǒng)中,有些對象的創(chuàng)建過程較為復(fù)雜,而且有時候需要頻繁創(chuàng)建,原型模式通過給出一個原型對象來有時候需要頻繁創(chuàng)建,原型模式通過給出一個原型對象來指明所要創(chuàng)建的對象的類型,然后用復(fù)制這個原型對象的指明所要創(chuàng)建的對象的類型,然后用復(fù)制這個原型對象的辦法創(chuàng)建出更多同類型的對象,這就是原型模式的意圖所辦法創(chuàng)建出更多同類型的對象,這就是原型模式的意圖所在。在。原型模式原型模式(Prototype)用原型實例指定創(chuàng)建對象的種類,用原型實例指定創(chuàng)建對

32、象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。并且通過拷貝這些原型創(chuàng)建新的對象。Prototype:抽象原型類:抽象原型類ConcretePrototype:具體原型類:具體原型類Client:客戶:客戶類類原型模式用原型實例指定創(chuàng)建對象的種類,并且通過復(fù)制原型模式用原型實例指定創(chuàng)建對象的種類,并且通過復(fù)制這些原型創(chuàng)建新的對象而無須知道任何創(chuàng)建的細(xì)節(jié)。原型模式這些原型創(chuàng)建新的對象而無須知道任何創(chuàng)建的細(xì)節(jié)。原型模式的基本工作原理是通過將一個原型對象傳給那個要進(jìn)行創(chuàng)建的的基本工作原理是通過將一個原型對象傳給那個要進(jìn)行創(chuàng)建的對象,這個要進(jìn)行創(chuàng)建的對象通過請求原型對象拷貝原型自己對象,這個要進(jìn)行創(chuàng)建的對

33、象通過請求原型對象拷貝原型自己來實現(xiàn)創(chuàng)建過程。來實現(xiàn)創(chuàng)建過程。 當(dāng)創(chuàng)建新的對象實例較為復(fù)雜時,使用原型模式可以簡當(dāng)創(chuàng)建新的對象實例較為復(fù)雜時,使用原型模式可以簡化對象的創(chuàng)建過程,通過一個已有實例可以提高新實例化對象的創(chuàng)建過程,通過一個已有實例可以提高新實例的創(chuàng)建效率。的創(chuàng)建效率。 可以動態(tài)增加或減少產(chǎn)品類??梢詣討B(tài)增加或減少產(chǎn)品類。 原型模式提供了簡化的創(chuàng)建結(jié)構(gòu)。原型模式提供了簡化的創(chuàng)建結(jié)構(gòu)。 可以使用深克隆的方式保存對象的狀態(tài)??梢允褂蒙羁寺〉姆绞奖4鎸ο蟮臓顟B(tài)。 需要為每一個類配備一個克隆方法,而且這個克隆需要為每一個類配備一個克隆方法,而且這個克隆方法需要對類的功能進(jìn)行通盤考慮,這對全新

34、的類方法需要對類的功能進(jìn)行通盤考慮,這對全新的類來說不是很難,但對已有的類進(jìn)行改造時,不一定來說不是很難,但對已有的類進(jìn)行改造時,不一定是件容易的事,必須修改其源代碼,違背了是件容易的事,必須修改其源代碼,違背了“開閉開閉原則原則”。 在實現(xiàn)深克隆時需要編寫較為復(fù)雜的代碼。在實現(xiàn)深克隆時需要編寫較為復(fù)雜的代碼。對于系統(tǒng)中的某些類來說,只有一個實例很重要,例對于系統(tǒng)中的某些類來說,只有一個實例很重要,例如,一個系統(tǒng)中可以存在多個打印任務(wù),但是只能有一個如,一個系統(tǒng)中可以存在多個打印任務(wù),但是只能有一個正在工作的任務(wù)。正在工作的任務(wù)。保證一個類只有一個實例的辦法是讓類自身負(fù)責(zé)保存保證一個類只有一個

35、實例的辦法是讓類自身負(fù)責(zé)保存它的唯一實例。這個類可以保證沒有其他實例被創(chuàng)建,并它的唯一實例。這個類可以保證沒有其他實例被創(chuàng)建,并且它可以提供一個訪問該實例的方法。且它可以提供一個訪問該實例的方法。單例模式單例模式(Singleton)保證一個類僅有一個實保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。例,并提供一個訪問它的全局訪問點。instanceif(instance=null) instance=new Singleton();return instance;Singleton- instance : Singleton-+Singleton ()getInstance ().:

36、Singleton:Singleton:單例:單例單例類擁有一個私有構(gòu)造函數(shù),確保用戶無法通過單例類擁有一個私有構(gòu)造函數(shù),確保用戶無法通過new關(guān)鍵字直接實例化它。除此之外,該模式中包含一個私有靜關(guān)鍵字直接實例化它。除此之外,該模式中包含一個私有靜態(tài)成員變量和公有的靜態(tài)工廠方法,該工廠方法負(fù)責(zé)檢驗實態(tài)成員變量和公有的靜態(tài)工廠方法,該工廠方法負(fù)責(zé)檢驗實例的存在性并實例化自己,然后存儲在靜態(tài)成員變量中,以例的存在性并實例化自己,然后存儲在靜態(tài)成員變量中,以確保只有一個實例被創(chuàng)建。確保只有一個實例被創(chuàng)建。 提供了對唯一實例的受控訪問。因為單例類封裝了它的提供了對唯一實例的受控訪問。因為單例類封裝了它

37、的唯一實例,所以它可以嚴(yán)格控制客戶怎樣以及何時訪問唯一實例,所以它可以嚴(yán)格控制客戶怎樣以及何時訪問它,并為設(shè)計及開發(fā)團(tuán)隊提供了共享的概念。它,并為設(shè)計及開發(fā)團(tuán)隊提供了共享的概念。 由于在系統(tǒng)內(nèi)存中只存在一個對象,因此可以節(jié)約系統(tǒng)由于在系統(tǒng)內(nèi)存中只存在一個對象,因此可以節(jié)約系統(tǒng)資源,對于一些需要頻繁創(chuàng)建和銷毀的對象,單例模式資源,對于一些需要頻繁創(chuàng)建和銷毀的對象,單例模式無疑可以提高系統(tǒng)的性能。無疑可以提高系統(tǒng)的性能。 允許可變數(shù)目的實例。我們可以基于單例模式進(jìn)行擴(kuò)展,允許可變數(shù)目的實例。我們可以基于單例模式進(jìn)行擴(kuò)展,使用與單例控制相似的方法來獲得指定個數(shù)的對象實例使用與單例控制相似的方法來獲得

38、指定個數(shù)的對象實例 由于單例模式中沒有抽象層,因此單例類的擴(kuò)展有很大的由于單例模式中沒有抽象層,因此單例類的擴(kuò)展有很大的困難。困難。 單例類的職責(zé)過重,在一定程度上違背了單例類的職責(zé)過重,在一定程度上違背了“單一職責(zé)原單一職責(zé)原則則”。因為單例類既充當(dāng)了工廠角色,提供了工廠方法,。因為單例類既充當(dāng)了工廠角色,提供了工廠方法,同時又充當(dāng)了產(chǎn)品角色,包含一些業(yè)務(wù)方法,將產(chǎn)品的創(chuàng)同時又充當(dāng)了產(chǎn)品角色,包含一些業(yè)務(wù)方法,將產(chǎn)品的創(chuàng)建和產(chǎn)品的本身的功能融合到一起。建和產(chǎn)品的本身的功能融合到一起。 濫用單例將帶來一些負(fù)面問題,如為了節(jié)省資源將數(shù)據(jù)庫濫用單例將帶來一些負(fù)面問題,如為了節(jié)省資源將數(shù)據(jù)庫連接池對

39、象設(shè)計為單例類,可能會導(dǎo)致共享連接池對象的連接池對象設(shè)計為單例類,可能會導(dǎo)致共享連接池對象的程序過多而出現(xiàn)連接池溢出;現(xiàn)在很多面向?qū)ο笳Z言程序過多而出現(xiàn)連接池溢出;現(xiàn)在很多面向?qū)ο笳Z言(如如Java、C#)的運行環(huán)境都提供了自動垃圾回收的技術(shù),因的運行環(huán)境都提供了自動垃圾回收的技術(shù),因此,如果實例化的對象長時間不被利用,系統(tǒng)會認(rèn)為它是此,如果實例化的對象長時間不被利用,系統(tǒng)會認(rèn)為它是垃圾,會自動銷毀并回收資源,下次利用時又將重新實例垃圾,會自動銷毀并回收資源,下次利用時又將重新實例化,這將導(dǎo)致對象狀態(tài)的丟失?;?,這將導(dǎo)致對象狀態(tài)的丟失。工廠方法模式解決計算器問題的工廠方法模式解決計算器問題的U

40、ML圖圖1.定義計算器類定義計算器類class Operation private double _numberA = 0; private double _numberB = 0; public double NumberA get return _numberA; set _numberA = value; public double NumberB get return _numberB; set _numberB = value; public virtual double GetResult() double result = 0; return result; class OperationAdd : Operation public override double GetResult() double result = 0; result = NumberA + NumberB; return result; class OperationSub : Operation publi

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論