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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、常常 文文 萃萃一、參考書目一、參考書目設計模式設計模式(Design Pattern)(Design Pattern)描述了在面向對象軟件描述了在面向對象軟件設計過程中針對特定問題的簡潔而優雅的解決方案,設計過程中針對特定問題的簡潔而優雅的解決方案,是是一套被反復使用的代碼設計經驗的總結。使用設計模式一套被反復使用的代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解和保證代是為了可重用代碼、讓代碼更容易被他人理解和保證代碼可靠性。碼可靠性。1.1.根據根據目的目的可分為創建型,結構型和行為型三種:可分為創建型,結構型和行為型三種: 創建型創建型模式主要用于創建對象。模式

2、主要用于創建對象。 結構型結構型模式主要用于處理類或對象的組合。模式主要用于處理類或對象的組合。 行為型行為型模式主要用于描述對類或對象怎樣交互和怎樣模式主要用于描述對類或對象怎樣交互和怎樣分配職責。分配職責。2.2.根據根據范圍范圍,可分為類模式和對象模式兩種:,可分為類模式和對象模式兩種: 類模式類模式處理類和子類之間的關系,這些關系通過繼承處理類和子類之間的關系,這些關系通過繼承建立,在編譯時刻就被確定下來,是屬于靜態的。建立,在編譯時刻就被確定下來,是屬于靜態的。 對象模式對象模式處理對象間的關系,這些關系在運行時刻變處理對象間的關系,這些關系在運行時刻變化,更具動態性。化,更具動態性

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

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

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

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

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

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

9、動機:只需要知道水果的名字則可得到相應的水果:只需要知道水果的名字則可得到相應的水果模式定義模式定義:簡單工廠模式專門定義一個類來負責創建其他類:簡單工廠模式專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。的實例,被創建的實例通常都具有共同的父類。在簡單工廠模式中,可以根據參數的不同返回不同類的實例。在簡單工廠模式中,可以根據參數的不同返回不同類的實例。三個角色:三個角色:Factory:工廠:工廠Product:抽象產品:抽象產品ConcreteProduct:具體產品:具體產品模式結構模式結構依賴依賴簡單工廠模式的要點在于:當你需要創建一個對象時,簡單工廠模式的要點

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

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

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

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

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

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

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

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

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

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

20、需要面對多法模式針對的是一個產品等級結構,而抽象工廠模式則需要面對多個產品等級結構。個產品等級結構。當系統所提供的工廠所需生產的具體產品并不是一個簡單的對象,當系統所提供的工廠所需生產的具體產品并不是一個簡單的對象,而是多個位于不同產品等級結構中屬于不同類型的具體產品時需要而是多個位于不同產品等級結構中屬于不同類型的具體產品時需要使用抽象工廠模式。使用抽象工廠模式。 基本代碼基本代碼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); 汽車包括車輪、方向盤、發送機等各種汽車包括車輪、方向盤、發送機等各種部件。用戶只需要指定汽車的類型就可部件。用戶只需要指定汽車的類型就可以得到一輛完整的汽車。以得到一輛完整的汽車。在軟件開發中,也存在大量類似汽車一樣的復雜對象,在軟件開發中,也存在大量類似汽車一樣的復雜對象,相當于一輛有待建造的汽車,而對象的屬性相當于汽車的相當于一輛有待建造的汽車,而對象的屬性相當于汽車的部件,建造產品的過程就相當于組合部件的過程。由于組部件,建造產品的過程就相當于組合部件的過程。由于組合部件的過程很復雜

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

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

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

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

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

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

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

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

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

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

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

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

39、象設計為單例類,可能會導致共享連接池對象的連接池對象設計為單例類,可能會導致共享連接池對象的程序過多而出現連接池溢出;現在很多面向對象語言程序過多而出現連接池溢出;現在很多面向對象語言(如如Java、C#)的運行環境都提供了自動垃圾回收的技術,因的運行環境都提供了自動垃圾回收的技術,因此,如果實例化的對象長時間不被利用,系統會認為它是此,如果實例化的對象長時間不被利用,系統會認為它是垃圾,會自動銷毀并回收資源,下次利用時又將重新實例垃圾,會自動銷毀并回收資源,下次利用時又將重新實例化,這將導致對象狀態的丟失。化,這將導致對象狀態的丟失。工廠方法模式解決計算器問題的工廠方法模式解決計算器問題的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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論