設計模式簡要介紹
- 單例(Singleton)模式:某個類隻能生成一個執行個體,該類提供了一個全局通路點供外部擷取該執行個體,其拓展是有限多例模式。
- 原型(Prototype)模式:将一個對象作為原型,通過對其進行複制而克隆出多個和原型類似的新執行個體。
- 工廠方法(Factory Method)模式:定義一個用于建立産品的接口,由子類決定生産什麼産品。
- 抽象工廠(AbstractFactory)模式:提供一個建立産品族的接口,其每個子類可以生産一系列相關的産品。
- 建造者(Builder)模式:将一個複雜對象分解成多個相對簡單的部分,然後根據不同需要分别建立它們,最後建構成該複雜對象。
- 代理(Proxy)模式:為某對象提供一種代理以控制對該對象的通路。即用戶端通過代理間接地通路該對象,進而限制、增強或修改該對象的一些特性。
- 擴充卡(Adapter)模式:将一個類的接口轉換成客戶希望的另外一個接口,使得原本由于接口不相容而不能一起工作的那些類能一起工作。
- 橋接(Bridge)模式:将抽象與實作分離,使它們可以獨立變化。它是用組合關系代替繼承關系來實作,進而降低了抽象和實作這兩個可變次元的耦合度。
- 裝飾(Decorator)模式:動态的給對象增加一些職責,即增加其額外的功能。
- 外觀(Facade)模式:為多個複雜的子系統提供一個一緻的接口,使這些子系統更加容易被通路。
- 享元(Flyweight)模式:運用共享技術來有效地支援大量細粒度對象的複用。
- 組合(Composite)模式:将對象組合成樹狀層次結構,使使用者對單個對象群組合對象具有一緻的通路性。
- 模闆方法(TemplateMethod)模式:定義一個操作中的算法骨架,而将算法的一些步驟延遲到子類中,使得子類可以不改變該算法結構的情況下重定義該算法的某些特定步驟。
- 政策(Strategy)模式:定義了一系列算法,并将每個算法封裝起來,使它們可以互相替換,且算法的改變不會影響使用算法的客戶。
- 指令(Command)模式:将一個請求封裝為一個對象,使送出請求的責任和執行請求的責任分割開。
-
職責鍊(Chain of
Responsibility)模式:把請求從鍊中的一個對象傳到下一個對象,直到請求被響應為止。通過這種方式去除對象之間的耦合。
- 狀态(State)模式:允許一個對象在其内部狀态發生改變時改變其行為能力。
- 觀察者(Observer)模式:多個對象間存在一對多關系,當一個對象發生改變時,把這種改變通知給其他多個對象,進而影響其他對象的行為。
- 中介者(Mediator)模式:定義一個中介對象來簡化原有對象之間的互動關系,降低系統中對象間的耦合度,使原有對象之間不必互相了解。
- 疊代器(Iterator)模式:提供一種方法來順序通路聚合對象中的一系列資料,而不暴露聚合對象的内部表示。
- 通路者(Visitor)模式:在不改變集合元素的前提下,為一個集合中的每個元素提供多種通路方式,即每個元素有多個通路者對象通路。
- 備忘錄(Memento)模式:在不破壞封裝性的前提下,擷取并儲存一個對象的内部狀态,以便以後恢複它。
- 解釋器(Interpreter)模式:提供如何定義語言的文法,以及對語言句子的解釋方法,即解釋器。
這些設計模式提供了一種在建立對象的同時隐藏建立邏輯的方式,而不是使用 new 運算符直接執行個體化對象。這使得程式在判斷針對某個給定執行個體需要建立哪些對象時更加靈活。
確定一個類隻有一個執行個體,并提供一個全局的通路點。
單例模式(Singleton Pattern)是 Java 中最簡單的設計模式之一。這種類型的設計模式屬于建立型模式,它提供了一種建立對象的最佳方式。
這種模式涉及到一個單一的類,該類負責建立自己的對象,同時確定隻有單個對象被建立。這個類提供了一種通路其唯一的對象的方式,可以直接通路,不需要執行個體化該類的對象。
注意:
1、單例類隻能有一個執行個體。
2、單例類必須自己建立自己的唯一執行個體。
3、單例類必須給所有其他對象提供這一執行個體。
當建立給定類的執行個體的過程很複雜的時候可以使用原型模式。
原型模式(Prototype Pattern)是用于建立重複的對象,同時又能保證性能。這種類型的設計模式屬于建立型模式,它提供了一種建立對象的最佳方式。
這種模式是實作了一個原型接口,該接口用于建立目前對象的克隆。當直接建立對象的代價比較大時,則采用這種模式。例如,一個對象需要在一個高代價的資料庫操作之後被建立。我們可以緩存該對象,在下一個請求時傳回它的克隆,在需要的時候更新資料庫,以此來減少資料庫調用。
工廠模式定義了一個建立對象的接口,但由子類決定要執行個體化的類是哪一個,工廠方法讓類把執行個體化推遲到子類。
工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一。這種類型的設計模式屬于建立型模式,它提供了一種建立對象的最佳方式。
在工廠模式中,我們在建立對象時不會對用戶端暴露建立邏輯,并且是通過使用一個共同的接口來指向新建立的對象。
提供一個接口,用于建立相關或者依賴對象的家族,而不需要明确指定具體類。
抽象工廠模式(Abstract Factory Pattern)是圍繞一個超級工廠建立其他工廠。該超級工廠又稱為其他工廠的工廠。這種類型的設計模式屬于建立型模式,它提供了一種建立對象的最佳方式。
在抽象工廠模式中,接口是負責建立一個相關對象的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供對象。
建造者模式封裝一個産品的構造過程,并允許按步驟構造。
建造者模式(Builder Pattern)使用多個簡單的對象一步一步建構成一個複雜的對象。這種類型的設計模式屬于建立型模式,它提供了一種建立對象的最佳方式。
一個 Builder 類會一步一步構造最終的對象。該 Builder 類是獨立于其他對象的。
這些設計模式關注類和對象的組合。繼承的概念被用來組合接口和定義組合對象獲得新功能的方式。
代理模式為一個對象提供一個替身或者占位符以控制對這個對象的通路。
在代理模式(Proxy Pattern)中,一個類代表另一個類的功能。這種類型的設計模式屬于結構型模式。
在代理模式中,我們建立具有現有對象的對象,以便向外界提供功能接口。
擴充卡模式将一個類的接口,轉換成客戶希望的另外一個接口。擴充卡模式将原本接口不相容的類可以合作無間。
擴充卡模式(Adapter Pattern)是作為兩個不相容的接口之間的橋梁。這種類型的設計模式屬于結構型模式,它結合了兩個獨立接口的功能。
這種模式涉及到一個單一的類,該類負責加入獨立的或不相容的接口功能。舉個真實的例子,讀卡器是作為記憶體卡和筆記本之間的擴充卡。您将記憶體卡插入讀卡器,再将讀卡器插入筆記本,這樣就可以通過筆記本來讀取記憶體卡。
我們通過下面的執行個體來示範擴充卡模式的使用。其中,音頻播放器裝置隻能播放 mp3 檔案,通過使用一個更進階的音頻播放器來播放 vlc 和 mp4 檔案。
橋接模式不隻改變你的實作,也改變你的抽象。
橋接(Bridge)是用于把抽象化與實作化解耦,使得二者可以獨立變化。這種類型的設計模式屬于結構型模式,它通過提供抽象化和實作化之間的橋接結構,來實作二者的解耦。
這種模式涉及到一個作為橋接的接口,使得實體類的功能獨立于接口實作類。這兩種類型的類可被結構化改變而互不影響。
裝飾者模式動态的将責任附加到對象身上,若要拓展功能,裝飾者提供了比繼承更有彈性的替代方案。
裝飾器模式(Decorator Pattern)允許向一個現有的對象添加新的功能,同時又不改變其結構。這種類型的設計模式屬于結構型模式,它是作為現有的類的一個包裝。
這種模式建立了一個裝飾類,用來包裝原有的類,并在保持類方法簽名完整性的前提下,提供了額外的功能。
我們通過下面的執行個體來示範裝飾器模式的用法。其中,我們将把一個形狀裝飾上不同的顔色,同時又不改變形狀類。
外觀模式提供了一個統一的接口,用來通路子系統中的一群接口。外觀定義了一個高層接口,讓子系統更容易使用。
外觀模式(Facade Pattern)隐藏系統的複雜性,并向用戶端提供了一個用戶端可以通路系統的接口。這種類型的設計模式屬于結構型模式,它向現有的系統添加一個接口,來隐藏系統的複雜性。
這種模式涉及到一個單一的類,該類提供了用戶端請求的簡化方法和對現有系統類方法的委托調用。
享元模式(Flyweight Pattern)主要用于減少建立對象的數量,以減少記憶體占用和提高性能。這種類型的設計模式屬于結構型模式,它提供了減少對象數量進而改善應用所需的對象結構的方式。
享元模式嘗試重用現有的同類對象,如果未找到比對的對象,則建立新對象。
組合模式允許你将對象組合成樹形結構來表現“整體/部分”層次結構。組合能讓客戶以一緻的方式處理個别對象以及對象組合。
組合模式(Composite Pattern),又叫部分整體模式,是用于把一組相似的對象當作一個單一的對象。組合模式依據樹形結構來組合對象,用來表示部分以及整體層次。這種類型的設計模式屬于結構型模式,它建立了對象組的樹形結構。
這種模式建立了一個包含自己對象組的類。該類提供了修改相同對象組的方式。
過濾器模式(Filter Pattern)或标準模式(Criteria Pattern)是一種設計模式,這種模式允許開發人員使用不同的标準來過濾一組對象,通過邏輯運算以解耦的方式把它們連接配接起來。這種類型的設計模式屬于結構型模式,它結合多個标準來獲得單一标準。
這些設計模式特别關注對象之間的通信。
模闆方法模式在一個方法中定義一個算法骨架,而将一些步驟延遲到子類中。模闆方法使得子類在不改變算法結構的情況下,重新定義算法中的某些步驟。
在模闆模式(Template Pattern)中,一個抽象類公開定義了執行它的方法的方式/模闆。它的子類可以按需要重寫方法實作,但調用将以抽象類中定義的方式進行。這種類型的設計模式屬于行為型模式。
政策模式定義了算法族,分别封裝起來,讓他們之間可以互相替換,此模式讓算法的變化獨立與使用算法的客服。
在政策模式(Strategy Pattern)中,一個類的行為或其算法可以在運作時更改。這種類型的設計模式屬于行為型模式。
在政策模式中,我們建立表示各種政策的對象和一個行為随着政策對象改變而改變的 context 對象。政策對象改變 context 對象的執行算法。
指令模式将請求封裝成對象,以便使用不同的請求、隊列或者日志參數化其他對象。指令模式也支援可撤銷的操作。
指令模式(Command Pattern)是一種資料驅動的設計模式,它屬于行為型模式。請求以指令的形式包裹在對象中,并傳給調用對象。調用對象尋找可以處理該指令的合适的對象,并把該指令傳給相應的對象,該對象執行指令。
責任鍊模式可以讓一個以上的對象有機會能夠處理某個請求。
顧名思義,責任鍊模式(Chain of Responsibility Pattern)為請求建立了一個接收者對象的鍊。這種模式給予請求的類型,對請求的發送者和接收者進行解耦。這種類型的設計模式屬于行為型模式。
在這種模式中,通常每個接收者都包含對另一個接收者的引用。如果一個對象不能處理該請求,那麼它會把相同的請求傳給下一個接收者,依此類推。
狀态模式允許對象在内部狀态改變的時候改變它的行為,對象看起來好像修改了它的類。
在狀态模式(State Pattern)中,類的行為是基于它的狀态改變的。這種類型的設計模式屬于行為型模式。
在狀态模式中,我們建立表示各種狀态的對象和一個行為随着狀态對象改變而改變的 context 對象。
觀察者模式定義了對象之間的一對多的依賴,這樣一來,當一個對象改變時,他的所有依賴者都會收到通知并自動更新。
當對象間存在一對多關系時,則使用觀察者模式(Observer Pattern)。比如,當一個對象被修改時,則會自動通知依賴它的對象。觀察者模式屬于行為型模式。
用中介者模式來集中相關對象之間複雜的溝通和控制方式。
中介者模式(Mediator Pattern)是用來降低多個對象和類之間的通信複雜性。這種模式提供了一個中介類,該類通常處理不同類之間的通信,并支援松耦合,使代碼易于維護。中介者模式屬于行為型模式。
疊代器模式提供一種方法順序通路一個聚合對象中的各個元素,而又不暴露其内部的表示。
疊代器模式(Iterator Pattern)是 Java 和 .Net 程式設計環境中非常常用的設計模式。這種模式用于順序通路集合對象的元素,不需要知道集合對象的底層表示。
疊代器模式屬于行為型模式。
當想要為一個對象的組合增加新的能力,且封裝不重要時,可以使用通路者模式。
在通路者模式(Visitor Pattern)中,我們使用了一個通路者類,它改變了元素類的執行算法。通過這種方式,元素的執行算法可以随着通路者改變而改變。這種類型的設計模式屬于行為型模式。根據模式,元素對象已接受通路者對象,這樣通路者對象就可以處理元素對象上的操作。
備忘錄模式讓對象傳回之前的狀态。
備忘錄模式(Memento Pattern)儲存一個對象的某個狀态,以便在适當的時候恢複對象。備忘錄模式屬于行為型模式。
解釋器模式為語言建立解釋器。
解釋器模式(Interpreter Pattern)提供了評估語言的文法或表達式的方式,它屬于行為型模式。這種模式實作了一個表達式接口,該接口解釋一個特定的上下文。這種模式被用在 SQL 解析、符号處理引擎等。
在空對象模式(Null Object Pattern)中,一個空對象取代 NULL 對象執行個體的檢查。Null 對象不是檢查空值,而是反應一個不做任何動作的關系。這樣的 Null 對象也可以在資料不可用的時候提供預設的行為。
在空對象模式中,我們建立一個指定各種要執行的操作的抽象類和擴充該類的實體類,還建立一個未對該類做任何實作的空對象類,該空對象類将無縫地使用在需要檢查空值的地方。
這些設計模式特别關注表示層。這些模式是由 Sun Java Center 鑒定的。
MVC 模式
MVC 模式代表 Model-View-Controller(模型-視圖-控制器) 模式。這種模式用于應用程式的分層開發。
- Model(模型) - 模型代表一個存取資料的對象或 JAVA POJO。它也可以帶有邏輯,在資料變化時更新控制器。
- View(視圖) - 視圖代表模型包含的資料的可視化。
- Controller(控制器) - 控制器作用于模型和視圖上。它控制資料流向模型對象,并在資料變化時更新視圖。它使視圖與模型分離開。
業務代表模式(Business Delegate Pattern)用于對表示層和業務層解耦。它基本上是用來減少通信或對表示層代碼中的業務層代碼的遠端查詢功能。在業務層中我們有以下實體。
- 用戶端(Client) - 表示層代碼可以是 JSP、servlet 或 UI java 代碼。
- 業務代表(Business Delegate) - 一個為用戶端實體提供的入口類,它提供了對業務服務方法的通路。
- 查詢服務(LookUp Service) - 查找服務對象負責擷取相關的業務實作,并提供業務對象對業務代表對象的通路。
- 業務服務(Business Service) - 業務服務接口。實作了該業務服務的實體類,提供了實際的業務實作邏輯。
組合實體模式(Composite Entity Pattern)用在 EJB 持久化機制中。一個組合實體是一個 EJB 實體 bean,代表了對象的圖解。當更新一個組合實體時,内部依賴對象 beans 會自動更新,因為它們是由 EJB 實體 bean 管理的。以下是組合實體 bean 的參與者。
- 組合實體(Composite Entity) - 它是主要的實體 bean。它可以是粗粒的,或者可以包含一個粗粒度對象,用于持續生命周期。
- 粗粒度對象(Coarse-Grained Object) - 該對象包含依賴對象。它有自己的生命周期,也能管理依賴對象的生命周期。
- 依賴對象(Dependent Object) - 依賴對象是一個持續生命周期依賴于粗粒度對象的對象。
- 政策(Strategies) - 政策表示如何實作組合實體。
資料通路對象模式(Data Access Object Pattern)或 DAO 模式用于把低級的資料通路 API 或操作從進階的業務服務中分離出來。以下是資料通路對象模式的參與者。
- 資料通路對象接口(Data Access Object Interface) - 該接口定義了在一個模型對象上要執行的标準操作。
- 資料通路對象實體類(Data Access Object concrete class) - 該類實作了上述的接口。該類負責從資料源擷取資料,資料源可以是資料庫,也可以是 xml,或者是其他的存儲機制。
- 模型對象/數值對象(Model Object/Value Object) - 該對象是簡單的 POJO,包含了 get/set 方法來存儲通過使用 DAO 類檢索到的資料
前端控制器模式(Front Controller Pattern)是用來提供一個集中的請求處理機制,所有的請求都将由一個單一的處理程式處理。該處理程式可以做認證/授權/記錄日志,或者跟蹤請求,然後把請求傳給相應的處理程式。以下是這種設計模式的實體。
- 前端控制器(Front Controller) - 處理應用程式所有類型請求的單個處理程式,應用程式可以是基于 web 的應用程式,也可以是基于桌面的應用程式。
- 排程器(Dispatcher) - 前端控制器可能使用一個排程器對象來排程請求到相應的具體處理程式。
- 視圖(View) - 視圖是為請求而建立的對象。
攔截過濾器模式(Intercepting Filter Pattern)用于對應用程式的請求或響應做一些預處理/後處理。定義過濾器,并在把請求傳給實際目标應用程式之前應用在請求上。過濾器可以做認證/授權/記錄日志,或者跟蹤請求,然後把請求傳給相應的處理程式。以下是這種設計模式的實體。
- 過濾器(Filter) - 過濾器在請求處理程式執行請求之前或之後,執行某些任務。
- 過濾器鍊(Filter Chain) - 過濾器鍊帶有多個過濾器,并在 Target 上按照定義的順序執行這些過濾器。
- Target - Target 對象是請求處理程式。
- 過濾管理器(Filter Manager) - 過濾管理器管理過濾器和過濾器鍊。
- 用戶端(Client) - Client 是向 Target 對象發送請求的對象。
服務定位器模式(Service Locator Pattern)用在我們想使用 JNDI 查詢定位各種服務的時候。考慮到為某個服務查找 JNDI 的代價很高,服務定位器模式充分利用了緩存技術。在首次請求某個服務時,服務定位器在 JNDI 中查找服務,并緩存該服務對象。當再次請求相同的服務時,服務定位器會在它的緩存中查找,這樣可以在很大程度上提高應用程式的性能。以下是這種設計模式的實體。
- 服務(Service) - 實際處理請求的服務。對這種服務的引用可以在 JNDI 伺服器中查找到。
- Context / 初始的 Context - JNDI Context 帶有對要查找的服務的引用。
- 服務定位器(Service Locator) - 服務定位器是通過 JNDI 查找和緩存服務來擷取服務的單點接觸。
- 緩存(Cache) - 緩存存儲服務的引用,以便複用它們。
- 用戶端(Client) - Client 是通過 ServiceLocator 調用服務的對象。
傳輸對象模式(Transfer Object Pattern)用于從用戶端向伺服器一次性傳遞帶有多個屬性的資料。傳輸對象也被稱為數值對象。傳輸對象是一個具有 getter/setter 方法的簡單的 POJO 類,它是可序列化的,是以它可以通過網絡傳輸。它沒有任何的行為。伺服器端的業務類通常從資料庫讀取資料,然後填充 POJO,并把它發送到用戶端或按值傳遞它。對于用戶端,傳輸對象是隻讀的。用戶端可以建立自己的傳輸對象,并把它傳遞給伺服器,以便一次性更新資料庫中的數值。以下是這種設計模式的實體。
- 業務對象(Business Object) - 為傳輸對象填充資料的業務服務。
- 傳輸對象(Transfer Object) - 簡單的 POJO,隻有設定/擷取屬性的方法。
- 用戶端(Client) - 用戶端可以發送請求或者發送傳輸對象到業務對象。
注:僅供學習交流之用,不當之處還請指正