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

程式猿小碼發表於2020-06-18

資料結構我們已經學了一部分了。是該瞭解瞭解設計模式了。習慣了CRUD的你,也該瞭解瞭解這一門神器、我為啥要說是神器呢?

因為在大廠的面試環節、以及很多的比如

  • Springboot
  • Mybatis

等開源框架中、大量的使用到了設計模式。為了我們在之後學習原始碼的時候不再懵逼,為啥這程式碼能這樣寫?為啥巴拉巴拉xxx

設計模式必須要肝完

簡介

設計模式,是一套被反覆使用、多數人知曉的、經過分類編目的、程式碼設計經驗的總結
它是解決特定問題的一系列套路,是前輩們的程式碼設計經驗的總結,具有一定的普遍性,可以反覆使用。其目的是為了提高程式碼的可重用性、程式碼的可讀性和程式碼的可靠性。

總結下來說就是:一種設計經驗、一種設計套路

想一下,被前輩們總結下來的東西。使用這麼多年、凝結為精華的東西、該學

建立型

我們首先來了解一下什麼是建立型,建立型 作為設計模式的一種分類,是描述如何將一個物件建立出來的。

我們都知道,JAVA 作為一種物件導向程式設計,最關鍵的關鍵字new 用來例項化一個物件。建立型分類、則是描述:如何更好的建立出一個物件

單例模式理解

單例模式,從字面意思上了解就是:它只負責建立出一個物件。因此被稱為單例模式。理解一下:我們的計算機都會有一個工作管理員。而在一臺windows 的電腦上。任何時候都只會例項化一個工作管理員物件。進而可以理解為單例模式

image.png

在一個工作管理員被呼叫的時候(物件已經被建立),再次使用ctrl+shift+esc 則任然返回這個已經被建立的工作管理員

UML 圖理解

可能我首次提到這個概念,所以簡介一下。

UML圖是用圖形化的方式表示軟體類與類之間的關係。用圖形化的方式,展示出眾多類之間的關聯關係。

類圖

如下圖,我用圖形的方式、描述了一個工作管理員類JobManagement.class
它有一個 私有化private的屬性management 型別為本身。
它有一個 公開的public 的方法getManagement() 返回型別為本身

image.png

  • 常用的型別修飾符就是 + 與 -

注意:“可見性”表示該屬性對類外的元素是否可見,包括公有(Public)、私有(Private)、受保護(Protected)和朋友(Friendly)4 種,在類圖中分別用符號+、-、#、~表示。
http://c.biancheng.net/view/1319.html

關聯關係

關聯關係就是用來表示:多個類之間存在怎麼樣的關係的表示方法。常用箭頭來表示。
image.png

虛線箭頭 依賴關係

虛線箭頭用來表示依賴關係 從使用類指向被依賴的類。這裡使用的類就是我們的main 方法。而被依賴類則是我們的工作管理員物件

菱形箭頭 聚合關係

聚合管理作為一種強關聯管理。一般用於成員變數的引用。

http://c.biancheng.net/view/1319.html

單例模式的特點

  • 物件只會被建立一次,並且重複使用
  • 全域性提供一個訪問點。靜態訪問點
  • 構造方法私有

學以致用

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

歡迎關注

banner

相關文章