Java設計模式學習總結

設計模式基礎學習總結

這篇總結主要是基於我以前設計模式基礎系列文章而造成的的。主要是把重要的知識點用本身的話說了一遍,可能會有一些錯誤,還望見諒和指點。謝謝程序員

更多詳細內容能夠查看個人專欄文章:設計模式學習
https://blog.csdn.net/a724888...算法

設計模式

建立型模式

建立型模式
建立型模式的做用就是建立對象,說到建立一個對象,最熟悉的就是 new 一個對象,而後 set 相關屬性。可是,在不少場景下,咱們須要給客戶端提供更加友好的建立對象的方式,尤爲是那種咱們定義了類,可是須要提供給其餘開發者用的時候。數據庫

單例

單例模式保證全局的單例類只有一個實例,這樣的話使用的時候直接獲取便可,好比數據庫的一個鏈接,Spring裏的bean,均可以是單例的。

單例模式通常有5種寫法。

第一種是餓漢模式,先把單例進行實例化,獲取的時候經過靜態方法直接獲取便可。缺點是類加載後就完成了類的實例化,浪費部分空間。

第二種是飽漢模式,先把單例置爲null,而後經過靜態方法獲取單例時再進行實例化,可是可能有多線程同時進行實例化,會出現併發問題。

第三種是逐步改進的方法,一開始能夠用synchronized關鍵字進行同步,可是開銷太大,然後改爲使用volatile修飾單例,而後經過一次檢查判斷單例是否已初始化,若是未初始化就使用synchronized代碼塊,再次檢查單例防止在這期間被初始化,然後才真正進行初始化。

第四種是使用靜態內部類來實現,靜態內部類只在被使用的時候才進行初始化,因此在內部類中進行單例的實例化,只有用到的時候纔會運行實例化代碼。而後外部類再經過靜態方法返回靜態內部類的單例便可。

第五種是枚舉類,枚舉類的底層實現其實也是內部類。枚舉類確保每一個類對象在全局是惟一的。因此保證它是單例,這個方法是最簡單的。

工廠模式

簡單工廠通常是用一個工廠建立多個類的實例。

工廠模式通常是指一個工廠服務一個接口,爲這個接口的實現類進行實例化

抽象工廠模式是指一個工廠服務於一個產品族,一個產品族可能包含多個接口,接口又會包含多個實現類,經過一個工廠就能夠把這些綁定在一塊兒,很是方便。

原型模式

通常經過一個實例進行克隆從而得到更多同一原型的實例。使用實例的clone方法便可完成。

建造者模式

建造者模式中有一個概念叫作鏈式調用,鏈式調用爲一個類的實例化提供便利,通常提供系列的方法進行實例化,實際上就是將set方法改造一下,將本來返回爲空的set方法改成返回this實例,從而實現鏈式調用。

建造者模式在此基礎上加入了builder方法,提供給外部進行調用,一樣使用鏈式調用來完成參數注入。

結構型模式

結構型模式
前面建立型模式介紹了建立對象的一些設計模式,這節介紹的結構型模式旨在經過改變代碼結構來達到解耦的目的,使得咱們的代碼容易維護和擴展。編程

橋接模式

有點複雜。建議參考原文設計模式

適配器模式

適配器模式用於將兩個不一樣的類進行適配。微信

適配器模式和代理模式的異同網絡

比較這兩種模式,實際上是比較對象適配器模式和代理模式,在代碼結構上,
它們很類似,都須要一個具體的實現類的實例。
可是它們的目的不同,代理模式作的是加強原方法的活;
適配器作的是適配的活,爲的是提供「把雞包裝成鴨,而後當作鴨來使用」,
而雞和鴨它們之間本來沒有繼承關係。多線程

適配器模式能夠分爲類適配器,對象適配器等。併發

類適配器經過繼承父類就能夠把本身適配成父類了。
而對象適配器則須要把對象傳入另外一個對象的構造方法中,以便進行包裝。框架

享元模式

/ 享元模式的核心在於享元工廠類,
// 享元工廠類的做用在於提供一個用於存儲享元對象的享元池,
// 用戶須要對象時,首先從享元池中獲取,
// 若是享元池中不存在,則建立一個新的享元對象返回給用戶,
// 在享元池中保存該新增對象。

//享元模式
// 英文是 Flyweight Pattern,不知道是誰最早翻譯的這個詞,感受這翻譯真的很差理解,咱們試着強行關聯起來吧。Flyweight 是輕量級的意思,享元分開來講就是 共享 元器件,也就是複用已經生成的對象,這種作法固然也就是輕量級的了。
//
// 複用對象最簡單的方式是,用一個 HashMap 來存放每次新生成的對象。每次須要一個對象的時候,先到 HashMap 中看看有沒有,若是沒有,再生成新的對象,而後將這個對象放入 HashMap 中。
//
// 這種簡單的代碼我就不演示了。

代理模式

// 咱們發現沒有,代理模式說白了就是作 「方法包裝」 或作 「方法加強」。
// 在面向切面編程中,算了仍是不要吹捧這個名詞了,在 AOP 中,
// 其實就是動態代理的過程。好比 Spring 中,
// 咱們本身不定義代理類,可是 Spring 會幫咱們動態來定義代理,
// 而後把咱們定義在 @Before、@After、@Around 中的代碼邏輯動態添加到代理中。

外觀模式

外觀模式通常封裝具體的實現細節,爲用戶提供一個更加簡單的接口。

經過一個方法調用就能夠獲取須要的內容。

組合模式

//組合模式用於表示具備層次結構的數據,使得咱們對單個對象和組合對象的訪問具備一致性。

//直接看一個例子吧,每一個員工都有姓名、部門、薪水這些屬性,
// 同時還有下屬員工集合(雖然可能集合爲空),
// 而下屬員工和本身的結構是同樣的,
// 也有姓名、部門這些屬性,
// 同時也有他們的下屬員工集合。

class Employee {
    private String name;
    private String dept;
    private int salary;
    private List<Employee> subordinates; // 下屬
}

裝飾者模式

裝飾者

裝飾者模式把每一個加強類都繼承最高級父類。而後須要功能加強時把類實例傳入加強類便可,而後加強類在使用時就能夠加強原有類的功能了。

和代理模式不一樣的是,裝飾者模式每一個裝飾類都繼承父類,而且能夠進行多級封裝。

行爲型模式

行爲型模式
行爲型模式關注的是各個類之間的相互做用,將職責劃分清楚,使得咱們的代碼更加地清晰。

策略模式

策略模式通常把一個策略做爲一個類,而且在須要指定策略的時候傳入實例,因而咱們能夠在須要使用算法的地方傳入指定算法。

命令模式

命令模式通常分爲命令發起者,命令以及命令接受者三個角色。

命令發起者在使用時須要注入命令實例。而後執行命令調用。

命令調用實際上會調用命令接收者的方法進行實際調用。

好比遙控器按鈕至關於一條命令,點擊按鈕時命令運行,自動調用電視機提供的方法便可。

模板方法模式

模板方法通常指提供了一個方法模板,而且其中有部分實現類和部分抽象類,而且規定了執行順序。

實現類是模板提供好的方法。而抽象類則須要用戶自行實現。

模板方法規定了一個模板中方法的執行順序,很是適合一些開發框架,因而模板方法也普遍運用在開源框架中。

狀態模式

少見。

觀察者模式和事件監聽機制

觀察者模式通常用於訂閱者和消息發佈者之間的數據訂閱。

通常分爲觀察者和主題,觀察者訂閱主題,把實例註冊到主題維護的觀察者列表上。

而主題更新數據時自動把數據推給觀察者或者通知觀察者數據已經更新。

可是因爲這樣的方式消息推送耦合關係比較緊。而且很難在不打開數據的狀況下知道數據類型是什麼。

知道後來爲了使數據格式更加靈活,使用了事件和事件監聽器的模式,事件包裝的事件類型和事件數據,從主題和觀察者中解耦。

主題當事件發生時,觸發該事件的全部監聽器,把該事件經過監聽器列表發給每一個監聽器,監聽獲得事件之後,首先根據本身支持處理的事件類型中找到對應的事件處理器,再用處理器處理對應事件。

責任鏈模式

責任鏈一般須要先創建一個單向鏈表,而後調用方只須要調用頭部節點就能夠了,後面會自動流轉下去。好比流程審批就是一個很好的例子,只要終端用戶提交申請,根據申請的內容信息,自動創建一條責任鏈,而後就能夠開始流轉了。

更多內容請關注微信公衆號【Java技術江湖】

這是一位阿里 Java 工程師的技術小站,做者黃小斜,專一 Java 相關技術:SSM、SpringBoot、MySQL、分佈式、中間件、集羣、Linux、網絡、多線程,偶爾講點Docker、ELK,同時也分享技術乾貨和學習經驗,致力於Java全棧開發!(關注公衆號後回覆」資料「便可領取 3T 免費技術學習資源以及我我原創的程序員校招指南、Java學習指南等資源)

相關文章
相關標籤/搜索