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