設計模式-秋招總結(純乾貨)

  • 單例模式

    作用:爲了保證某個類只有一個對象存在.

    實現:將構造函數私有化,然後提供一個靜態的單實例.構造這個靜態單實例又分餓漢式與懶漢式,同時還要注意線程安全問題.

    破壞單例:

    1. 反射,解決方案: 在私有構造函數加入邏輯判斷(如果靜態實例變量不爲null,直接拋異常)
    2. 序列化與反序列化,解決方案: 只要在Singleton類中定義readResolve()方法,方法直接返回單例對象,即可解決.
  • 工廠模式

    作用:將對象的創建與對象的使用隔離開,爲什麼這麼做呢?如果我們創建對象這個代碼需要改動的時候,需要改動多處.而使用工廠模式,則只需修改一處即可.還是一個將變化與不變化分開的思想,這種解耦思想值得體會.

    簡單工廠: 通過傳入的參數來區分某一具體的產品對象.硬編碼,當產品種類增加時,需要改動原有代碼.

    工廠方法: 通過具體工廠實現類來區分生成的是哪個具體產品,當產品種類增加時,只需.新增相應的具體工廠實習類.

    抽象工廠:某一具體工廠生產多類產品下多個具體產品.

    三者可以通過一個小故事來理解(記得不太清楚,哈哈,只能自己編了).從前有一家飯店,顧客通過菜單來點餐,但是菜的菜系越來越多,菜單就需要不斷更改,這就類似簡單工廠.然後,這家店越做越大,開了非常多的分店,像粵菜,湘菜,川菜,這樣菜系增加時只需要開一家分店(專門做一個菜系),每家分店的菜單差不多就固定了.這就是工廠方法模式.最終這家店越做越大,成長成一個綜合餐飲連鎖店,每一家分店,不但確定了具體的菜系,同時還搭配了具體飲料與具體甜點,這三者構成了產品族(一一對應).也就是抽象工廠是工廠方法的進一步表現形式.

  • 建造者模式

    作用:當構造函數參數過多時,推薦使用建造者模式.

    Builder:用於構造每個成員變量,相當於把需要的數據準備好了.

    Director:將Builder保存的值取出來構造成一個對象.

    基本思想: 將數據準備(Builder生產者)與數據填充(Director消費者)相互分開,解耦的思想.

  • 原型模式

    作用:用於創建大量相近的對象.

    基本思想: 使用一個模板,在一個模板上稍作改動,便可減少很多的操作.

    具體實現: 使用一個模板對象,然後使用clone(),再在其上稍作修改.

  • 責任鏈模式

    作用: 數據或者請求需要經過多個處理,並且這些處理需要靈活添加與刪除.

    基本思想: 如果直接硬編碼的話,需要添加處理操作的話,需要改動原有代碼.我們利用第三者的思想,給出一個第三者(一般爲一個鏈式結構),需要添加操作時,只需往這個鏈式結構上註冊就行,刪除邏輯類似,而調用者只需與鏈式結構打交道,只需遍歷一遍鏈表,然後執行所有操作.原來的操作與調用者也因第三者的影響,互相不干擾.

  • 觀察者模式

    作用:在某一事件觸發時,通知多個觀察者.

    基本思想:與上面的責任鏈類似,在事件觸發時,如果直接硬編碼的方式,通知多個觀察者,在觀察者需要增加時,還得改代碼,我們也是通過一個鏈式結構來解耦的.觀察者只需將其需要被通知的方法(函數式接口)註冊到鏈式結構上,當事件觸發時,遍歷鏈式結構,依次通知.

  • 命令模式

    將任務執行者與任務實際接收者通過第三者Command對象解耦.(不太容易理解)

  • 迭代器模式

    由於不同的集合類的內部數據結構不同,有數組,鏈表,紅黑樹,哈希等等,我們需要指定一個統一的訪問集合方式(標準),這個時候就用到了迭代器模式了.(還是很好理解的).每個集合都能夠返回自己的具體迭代方式實現類,然後通過一系列的標準訪問方式就行了.

  • 中介模式

    根據迪米特法則,類與類之間儘量少關聯.所以在多個類構成的一個大環境下,我們可以通過一個第三者Mediator來解耦,每個類只和中介類Mediator打交道,通過Mediator間接與其他類發生關聯.

  • 狀態模式

    允許對象在內部狀態改變時改變它的行爲,對象看起來好像修改了它所屬的類。當外部通過傳入不同的參數,類內部的狀態成員變量相應地改變,由於類內部狀態的變化,其方法也隨之發生改變.

  • 策略模式

    廣義上來說,就是爲了提升擴展性,當某個功能不好確定時,爲了方便更改,我們不直接寫死代碼,而是通過外部傳進來的參數(傳進來的是一段邏輯,也就是一個方法,當然在java裏不能直接傳入方法,只能通過傳入一個類,然後調用類的方法來實現),這樣參數不同,邏輯也不同.

  • 模板方法

    這個就不說了,好多框架都用到了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章