1. 程式人生 > >JAVA設計模式 1 設計模式介紹、單例模式的理解與使用

JAVA設計模式 1 設計模式介紹、單例模式的理解與使用

資料結構我們已經學了一部分了。是該瞭解瞭解設計模式了。習慣了`CRUD`的你,也該瞭解瞭解這一門神器、我為啥要說是神器呢? 因為在大廠的面試環節、以及很多的比如 - Springboot - Mybatis 等開源框架中、大量的使用到了設計模式。為了我們在之後學習原始碼的時候不再懵逼,為啥這程式碼能這樣寫?為啥巴拉巴拉xxx **設計模式必須要肝完** ## 簡介 設計模式,是一套被反覆使用、多數人知曉的、經過分類編目的、`程式碼設計經驗的總結`。 它是`解決特定問題`的一系列`套路`,是前輩們的程式碼設計經驗的總結,具有一定的普遍性,可以反覆使用。其目的是為了提高程式碼的可重用性、程式碼的可讀性和程式碼的可靠性。 總結下來說就是:`一種設計經驗、一種設計套路` 想一下,被前輩們總結下來的東西。使用這麼多年、凝結為精華的東西、該學 ### 建立型 我們首先來了解一下什麼是建立型,`建立型` 作為設計模式的一種分類,是描述如何將一個物件創建出來的。 我們都知道,JAVA 作為一種`面向物件程式設計`,最關鍵的關鍵字`new` 用來例項化一個物件。建立型分類、則是描述:`如何更好的創建出一個物件` ## 單例模式理解 單例模式,從字面意思上了解就是:它只負責創建出一個物件。因此被稱為單例模式。理解一下:我們的計算機都會有一個`工作管理員`。而在一臺windows 的電腦上。任何時候都只會例項化一個工作管理員物件。進而可以理解為`單例模式` ![image.png](https://file.chaobei.xyz/blogs/image_1592317062904.png_imagess) 在一個工作管理員被呼叫的時候(物件已經被建立),再次使用`ctrl+shift+esc` 則任然返回這個已經被建立的`工作管理員`。 ### UML 圖理解 可能我首次提到這個概念,所以簡介一下。 UML圖是用圖形化的方式表示軟體類與類之間的關係。用圖形化的方式,展示出眾多類之間的關聯關係。 ### 類圖 如下圖,我用圖形的方式、描述了一個工作管理員類`JobManagement.class` 它有一個 `私有化private`的屬性`management` 型別為本身。 它有一個 `公開的public` 的方法`getManagement()` 返回型別為本身 ![image.png](https://file.chaobei.xyz/blogs/image_1592317930385.png_imagess) - 常用的型別修飾符就是 + 與 - > 注意:“可見性”表示該屬性對類外的元素是否可見,包括公有(Public)、私有(Private)、受保護(Protected)和朋友(Friendly)4 種,在類圖中分別用符號+、-、#、~表示。 http://c.biancheng.net/view/1319.html ### 關聯關係 關聯關係就是用來表示:多個類之間存在怎麼樣的關係的表示方法。常用箭頭來表示。 ![image.png](https://file.chaobei.xyz/blogs/image_1592406177671.png_imagess) #### 虛線箭頭 依賴關係 虛線箭頭用來表示`依賴關係` 從使用類指向被依賴的類。這裡使用的類就是我們的`main` 方法。而被依賴類則是我們的`工作管理員物件` #### 菱形箭頭 聚合關係 聚合管理作為一種強關聯管理。一般用於成員變數的引用。 > http://c.biancheng.net/view/1319.html ## 單例模式的特點 - 物件只會被建立一次,並且重複使用 - 全域性提供一個訪問點。靜態訪問點 - 構造方法`私有` ## 學以致用 ```java public class JobManagement { private static volatile JobManagement management; private JobManagement() { } public static synchronized JobManagement getManagement() { if (null == management) { System.out.println("未建立工作管理員,正在建立。。"); management = new JobManagement(); } else { System.out.println("已經存在建立的工作管理員"); } return management; } } ``` 工作管理員物件包含以及靜態型別的自身物件引用。以及將自身的構造方法進行私有化、使得外部無法直接建立物件。而需要這個物件,則需要呼叫`get()`方法進行獲取。 - `volatile` 關鍵字將屬性在所有執行緒中同步 ### 懶漢模式 ``` if (null == management) { System.out.println("未建立工作管理員,正在建立。。"); management = new JobManagement(); } ``` 懶漢模式則是在物件首次被訪問的時候才進行建立的。否則、若這個物件從未被引用、則物件是不會被建立的。而餓漢模式,剛剛相反。 ### 餓漢模式 ```java private static JobManagement management = new JobManagement(); ``` 餓漢模式則是則是在類被虛擬機器載入的時候就建立一個示例出來。這樣在訪問之前就已經有物件被建立、執行緒也是安全的。 ### 測試使用 ```java public static void main(String[] args) { JobManagement management1 = JobManagement.getManagement(); System.out.println(management1); JobManagement management2 = JobManagement.getManagement(); System.out.println(management2); } ---------------------------- 未建立工作管理員,正在建立。。 JobManagement@1b6d3586 已經存在建立的工作管理員 JobManagement@1b6d3586 ``` ## 小結 單例模式在Java 的學習中還是有很多地方會使用到,對於我們學習的第一個,也是最簡單的模式,也是最常用的模式。記住它的特點: - 構造方法私有 - 提供一個全域性訪問點 ### 參考 http://c.biancheng.net/view/1338.html ## 歡迎關注 ![banner](https://file.chaobei.xyz/blogs/banner_15911926172