設計模式筆記

一、   單態模式----創建模式

定義: Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。
適用性: 
     1.當類只能有一個實例而且客戶可以從一個衆所周知的訪問點訪問它時。
 
       2.當這個唯一實例應該是通過子類化可擴展的,並且客戶應該無需更改代碼就能使用一個擴展的實例時。
使用Singleton的好處:還在於可以節省內存,因爲它限制了實例的個數,有利於Java垃圾回收(garbage collection)。
第一種形式:
 

public class Singleton {

  private Singleton(){}

    private static Singleton instance = new Singleton(); 
  public static Singleton getInstance() {
    return instance;   

   }
}

 

第二種形式:

public class Singleton {

  private static Singleton instance = null;

  
public static synchronized Singleton getInstance() {
  //這個方法比上面有所改進,不用每次都進行生成對象,只是第一次     

  //使用時生成實例,提高了效率!
  if (instance==null)
    instance
new Singleton();
  return instance;   }

}

 雙鎖就不用寫了。。前面寫過

二、    工廠模式Factory-----創建模式

爲何使用?
工廠模式是我們最常用的模式了,著名的Jive論壇 ,就大量使用了工廠模式,工廠模式在Java程序系統可以說是隨處可見。

爲什麼工廠模式是如此常用?因爲工廠模式就相當於創建實例對象的new,我們經常要根據類Class生成實例對象,如A a=new A() 工廠模式也是用來創建實例對象的,所以以後new時就要多個心眼,是否可以考慮實用工廠模式,雖然這樣做,可能多做一些工作,但會給你係統帶來更大的可擴展性儘量少的修改量

1、 工廠方法:   
概述: 定義一個用於創建對象的接口,讓子類決定實例化哪一個類。FactoryMethod使一個類的實例化延遲到其子類。
適用性:

    1.當一個類不知道它所必須創建的對象的類的時候。

    2.當一個類希望由它的子類來指定它所創建的對象的時候。

    3.當類將創建對象的職責委託給多個幫助子類中的某一個,並且你希望將哪一個幫助子類是代理者這一信息局部化的時候。

2、抽象工廠

概述:提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
適用性:
        1.一個系統要獨立於它的產品的創建、組合和表示時。
        2.一個系統要由多個產品系列中的一個來配置時。
        3.當你要強調一系列相關的產品對象的設計以便進行聯合使用時。
        4.當你提供一個產品類庫,而只想顯示它們的接口而不是實現時。
 
工廠方法和抽象工廠的區別在於需要創建對象的複雜程度上。

 

 

 

三、   原型模式------創建模式

   述:用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象。
Prototype模式允許一個對象再創建另外一個可定製的對象,根本無需知道任何如何創建的細節。
工作原理:通過將一個原型對象傳給那個要發動創建的對象,這個要發動創建的對象通過請求原型對象拷貝它們自己來實施創建。
適用性
        1.當一個系統應該獨立於它的產品創建、構成和表示時。
        2.當要實例化的類是在運行時刻指定時,例如,通過動態裝載。
        3.爲了避免創建一個與產品類層次平行的工廠類層次時。
        4.當一個類的實例只能有幾個不同狀態組合中的一種時。
        5.在創建某對象時,某些屬性上有區別,而大部分都很相似的情況下,又不想使用new,這時就可用原型模式。
 
            建立相應數目的原型並克隆它們可能比每次用合適的狀態手工實例化該類更方便一些。
如何使用?

實現cloneable接口,重寫clone方法。
 
 
四、      建造者模式----創建模式
概述將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
適用性:
   1.當創建複雜對象的算法應該獨立於該對象的組成部分以及它們的裝配方式時。
   2.當構造過程必須允許被構造的對象有不同的表示時。

Builder模式是一步一步創建一個複雜的對象,它允許用戶可以只通過指定複雜對象的類型和內容就可以構建它們.用戶不知道內部的具體構建細節.Builder模式是非常類似抽象工廠模式,細微的區別大概只有在反覆使用中才能體會到.

爲何使用?
是爲了將構建複雜對象的過程和它的部件解耦.注意: 是解耦過程部件.

因爲一個複雜的對象,不但有很多大量組成部分,如汽車,有很多部件:車輪方向盤 發動機還有各種小零件等等,部件很多,但遠不止這些,如何將這些部件裝配成一輛汽車,這個裝配過程也很複雜(需要很好的組裝技術),Builder模式就是爲了將部件和組裝過程分開.

如何使用?
首先假設一個複雜對象是由多個部件組成的,Builder模式是把複雜對象的創建和部件的創建分別開來,分別用Builder類和Director類來表示.。。。。

Builder模式的應用
Java實際使用中,我們經常用到""(Pool)的概念,當資源提供者無法提供足夠的資源,並且這些資源需要被很多用戶反覆共享時,就需要使用池.

""實際是一段內存,當池中有一些複雜的資源的"斷肢"(比如數據庫的連接池,也許有時一個連接會中斷),如果循環再利用這些"斷肢",將提高內存使用效率,提高池的性能.修改Builder模式中Director類使之能診斷"斷肢"斷在哪個部件上,再修復這個部件.

五、   外觀模式(facade---結構模式

Facade的定義: 爲子系統中的一組接口提供一個一致的界面,Facade模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。

適用性:

        1.當你要爲一個複雜子系統提供一個簡單接口時。子系統往往因爲不斷演化而變得越來越複雜。大多數模式使用時都會產生更多更小的類。這使得子系統更具可重用性,也更容易對子系統進行定製,但這也給那些不需要定製子系統的用戶帶來一些使用上的困難。
      Facade可以提供一個簡單的缺省視圖,這一視圖對大多數用戶來說已經足夠,而那些需要更多的可定製性的用戶可以越過facade層。
    2.客戶程序與抽象類的實現部分之間存在着很大的依賴性。引入facade將這個子系統與客戶以及其他的子系統分離,可以提高子系統的獨立性和可移植性。
    3.當你需要構建一個層次結構的子系統時,使用facade模式定義子系統中每層的入口點。
      如果子系統之間是相互依賴的,你可以讓它們僅通過facade進行通訊,從而簡化了它們之間的依賴關係。

 

六、   裝飾模式  Decorator---結構模式

概述動態地給一個對象添加一些額外的職責。就增加功能來說,Decorator模式相比生成子類更爲靈活。

適用性:

1.在不影響其他對象的情況下,以動態、透明的方式給單個對象添加職責。
          2.處理那些可以撤消的職責。
          3.當不能採用生成子類的方法進行擴充時。

爲什麼使用Decorator?
我們通常可以使用繼承來實現功能的拓展,如果這些需要拓展的功能的種類很繁多,那麼勢必生成很多子類,增加系統的複雜性,同時,使用繼承實現功能拓展,我們必須可預見這些拓展功能,這些功能是編譯時就確定了,是靜態的.

使用Decorator的理由:這些功能需要由用戶動態決定加入的方式和時機.Decorator提供了"即插即用"的方法,在運行期間決定何時增加何種功能。

 

 

代理模式---結構模式
概念爲其他對象提供一種代理以控制對這個對象的訪問。
適用性
1.遠程代理(RemoteProxy)爲一個對象在不同的地址空間提供局部代表。
    2.虛代理(VirtualProxy)根據需要創建開銷很大的對象。
    3.保護代理(ProtectionProxy)控制對原始對象的訪問。
    4.智能指引(SmartReference)取代了簡單的指針,它在訪問對象時執行一些附加操作。

爲什麼要使用Proxy?
1.
授權機制不同級別的用戶對同一對象擁有不同的訪問權利,Jive論壇系統中,就使用Proxy進行授權機制控制,訪問論壇有兩種人:註冊用戶和遊客(未註冊用戶),Jive中就通過類似ForumProxy這樣的代理來控制這兩種用戶對論壇的訪問權限.

2.某個客戶端不能直接操作到某個對象,但又必須和那個對象有所互動。
舉例兩個具體情況:
(1)
如果那個對象是一個是很大的圖片,需要花費很長時間才能顯示出來,那麼當這個圖片包含在文檔中時,使用編輯器或瀏覽器打開這個文檔,打開文檔必須很迅速,不能等待大圖片處理完成,這時需要做個圖片Proxy來代替真正的圖片
.

(2)
如果那個對象在Internet的某個遠端服務器上,直接操作這個對象因爲網絡速度原因可能比較慢,那我們可以先用Proxy來代替那個對象.

總之原則是,對於開銷很大的對象,只有在使用它時才創建,這個原則可以爲我們節省很多寶貴的Java內存. 所以,有些人認爲Java耗費資源內存,我以爲這和程序編制思路也有一定的關係.

 
                    
 

七、   適配器模式---結構模式

概述:將一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使得原本由於接口不兼容而不能一起工作的那些類可以一起工作。
定義:

將兩個不兼容的類糾合在一起使用,屬於結構型模式,需要有Adaptee(被適配者)Adaptor(適配器)兩個身份.
特點:繼承一個類,組合一個類。一般是繼承已有類,組合別人的類。
好處:通過重寫,用戶調用方法沒變。
適用性:
    1.你想使用一個已經存在的類,而它的接口不符合你的需求。
    2.你想創建一個可以複用的類,該類可以與其他不相關的類或不可預見的類(即那些接口可能不一定兼容的類)協同工作。
    3.(僅適用於對象Adapter)你想使用一些已經存在的子類,但是不可能對每一個都進行子類化以匹配它們的接口。對象適配器可以適配它的父類接口。

爲何使用?
我們經常碰到要將兩個沒有關係的類組合在一起使用,第一解決方案是:修改各自類的接口,但是如果我們沒有源代碼,或者,我們不願意爲了一個應用而修改各自的接口。怎麼辦? 使用Adapter,在這兩種接口之間創建一個混合接口(混血兒).

 

八、   觀察者模式---行爲模式

概念:定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新。
適用性:
1.當一個抽象模型有兩個方面,其中一個方面依賴於另一方面。
      將這二者封裝在獨立的對象中以使它們可以各自獨立地改變和複用。
   2.當對一個對象的改變需要同時改變其它對象,而不知道具體有多少對象有待改變。
   3.當一個對象必須通知其它對象,而它又不能假定其它對象是誰。
九、      模板方法---行爲模式
概述: 定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。
TemplateMethod使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
適用性:
1.一次性實現一個算法的不變的部分,並將可變的行爲留給子類來實現。
   2.各子類中公共的行爲應被提取出來並集中到一個公共父類中以避免代碼重複。
    首先識別現有代碼中的不同之處,並且將不同之處分離爲新的操作。
    最後,用一個調用這些新的操作的模板方法來替換這些不同的代碼。
3.控制子類擴展。
好處:擴展性強,以後類的內容變化,我只要再做一個繼承子類就可以,不必修改其他應用代碼.
十一、 命令模式----行爲模式
概念:將一個請求封裝爲一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日誌,以及支持可撤消的操作。

Command定義
不少Command模式的代碼都是針對圖形界面的,它實際就是菜單命令,我們在一個下拉菜單選擇一個命令時,然後會執行一些動作.

將這些命令封裝成在一個類中,然後用戶(調用者)再對這個類進行操作,這就是Command模式,換句話說,本來用戶(調用者)是直接調用這些命令的,如菜單上打開文檔(調用者),就直接指向打開文檔的代碼,使用Command模式,就是在這兩者之間增加一箇中間者,將這種直接關係拗斷,同時兩者之間都隔離,基本沒有關係了.

好處:符合封裝的特性,降低耦合度,Command是將對行爲進行封裝的典型模式,Factory是將創建進行封裝的模式,
Command模式,我也發現設計模式一個"通病":好象喜歡將簡單的問題複雜化, 喜歡在不同類中增加第三者,當然這樣做有利於代碼的健壯性 可維護性 還有複用性.

 

 

 

十二、 責任鏈模式----行爲模式

概念: 使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關係。將這些對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有一個對象處理它爲止。
這一模式的想法是,給多個對象處理一個請求的機會,從而解耦發送者和接受者.
適用性:
    1.有多個的對象可以處理一個請求,哪個對象處理該請求運行時刻自動確定。
    2.你想在不明確指定接收者的情況下,向多個對象中的一個提交一個請求。
    3.可處理一個請求的對象集合應被動態指定。
                   

十三、 代理模式和裝飾模式的區別?

裝飾模式:以對客戶端透明的方式擴展對象的功能,是繼承關係的一個替代方案;
代理模式:給一個對象提供一個代理對象,並有代理對象來控制對原有對象的引用;
裝飾模式應該爲所裝飾的對象增強功能;代理模式對代理的對象施加控制,並不提供對象本身的增強功能

二者的實現機制確實是一樣的,可以看到他們的實例代碼重複是很多的。但就語義上說,這兩者的功能是相反的,模式的一個重要作用是簡化其他程序員對你程序的理解,你在一個地方寫裝飾,大家就知道這是在增加功能,你寫代理,大家就知道是在限制,雖然代碼很可能相同,但如果你都叫他們裝飾,別人會很迷惑的。

 

十四、 抽象工廠和模板方法的區別?

模板方法在創建和使用中沒有得到產品,最大的區別就是在繼承關係中沒有產品

構建過程。抽象工廠是要創建產品的,工廠根據產品決定。 

發佈了18 篇原創文章 · 獲贊 4 · 訪問量 7856
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章