常見面試題之設計模式

  • 設計模式分類

       創建模式:工廠模式,單例模式,原型模式等
       
       結構模式:適配器,組合,裝飾器,門面,代理等
       
       行爲模式:模板方法,責任鏈,策略,觀察者等
    
  • 簡單工廠,工廠方法,抽象工廠(創建模式)

     簡單工廠:提供一個靜態方法,根據傳入的不同參數創建不同的對象(同一個父類,不同實現)
       
     工廠方法:需要兩種或者以上的產品,提供一個接口,一個抽象方法,實現多個工廠,不同工廠生產不同類型的產品
     對生產的產品做簡單的分配,單從大範圍來看,還是一種產品。
     
     抽象工廠:需要生產一個產品族,來獲得一個產品,產品族之間的產品是不能簡單組合的,有兼容問題的;
     這樣一個產品族的產品最好就能出自同一個工廠,提供一個接口,裏面定義生產產品族的所有產品的抽象方法,
     每個工廠實現實現自己產品族的所有方法,不同的產品用不同的工廠即可。
    
     區別:
     	1.簡單工廠強調簡單需要一個類型的不同實現
     	
     	2.工廠方法強調需要使用多個工廠,對產品的簡單分類,單其實還是屬於一種類型產品
     	  (例子:食物,我們分爲兩個工廠生產,分別生產中國食物和美國食物,用不同的工廠生產)
     	  
     	3.抽象工廠強調生產一個產品,但是這個產品是由很多組件的,那麼這些這個產品的所有組件最好來着一個工廠
     	  生產,這樣避免組件之間有兼容問題。
     	 (例子:生產一臺電腦,一個電腦有cpu,內存條,那麼同一個品牌的產品,最好定義自己的工廠;
     	    工廠裏面自己生產自己所有的子產品,最後構建一臺電腦出來)
     	    
     總結:工廠模式都是強調怎麼去生產一種類型的對象,生產出來的對象是一個父類的,帶着這個思路去思考。
    
  • 單例模式(創建模式)

    餓漢式:直接使用靜態變量,直接創建一個對象即可,然後使用一個靜態方法暴露出去
    飽漢式:屬於懶加載的方式,在需要時纔去初始化,只要注意線程安全即可,建議使用雙重檢查的方式去使用同步塊,
    但是要注意重排問題,所以聲明的靜態變量加上volatile
    枚舉方式:將需要的對象定義在枚舉中,在類加載就會進行實例化
    
  • 代理模式(結構模式)

    靜態代理:代理類和被代理類對象是一種組合的關係,他們實現同一個接口,代理類的所有實現
    		都是內部調用被代理對象相應的方法,然後在調用前後做一些增強,更好控制被代理對象的訪問,
    		讓訪問者與被訪問對象進行解耦。
    		(缺點:每一個要實現代理的對象都要實現一個代理類,代碼冗餘,維護成本高)
    動態代理:動態代理對象可以通過JDK代理一個類就能對所有對象生成代理類,比較通用,實現的功能和
    		靜態代理一樣的。
    
  • 適配器模式(結構模式)

    適配器模式:適配器模式強調的是兩個不相關的類型,但是有相似的功能,需要做功能的嫁接,這個時候我們就需要
    		添加一個適配器類,適配器需要繼承我們需要的類型,然後要嫁接的功能通過組合對象的方式組合進來,
    		然後再適配器的實現方法中調用組合對象的方法作爲實現,這樣就達到了類型轉換的作用。
    		
    適配器和代理模式區別:
    	   1.代理類的類型和被代理對象是同一種類型,而適配器不是
    	   2.代理目的是爲了方法增強,控制被代理對象的訪問;適配器目的只是爲了將相同功能的對象,通過適配器
    	     作爲類型的轉換。
    
  • 策略模式(行爲模式)

    策略模式:實現一個功能,有比較多的實現策略,需要不同場景和條件用到的實現是不同的.
    		(開發中常用的SpringContext,注入容器,然後通過beanName獲取不同實現)
    
  • 模板方式模式(行爲模式)

    模板方法:場景一般是,會定義一個抽象類,一般抽象類中只有一個方法實現,其他都定義爲抽象方法。
    		這個實現的方法就是模板方法,定義抽象方法的調用順序,定義基本的規則,具體行爲交給子類去實現。
    
  • 責任鏈模式(行爲模式)

    責任鏈模式:一般比較強調流程的流轉的場景,定義一個抽象類,內部定義一個屬性指定下一個處理器,定義一個抽象處理請
    求方法,然後將所有的處理器實現組成一個鏈表,每個實現是一個處理節點,用戶發送請求,那麼就會按照這個責任鏈
    一個個節點流轉處理。(強調多個實現之間的組合處理流程,不強調單個實現的使用,這是與策略模式的區別)
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章