單例模式

在講單例模式之前首先要知道什麼是設計模式,那麼什麼是設計模式呢?
百度百科是這樣解釋的:設計模式(Design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。簡單地說,設計模式是可以重複利用的解決方案。
設計模式的提出是在1995 人,是由4 爲作者提出的,稱爲GoF,也就是“四人組”。
設計模式從結構上分爲三類:

  • 創建型
  • 結構性
  • 行爲型

其中最簡單的設計模式就是單例了,單例這種模式,儘量少用,也有將其稱爲“反模式”。
單例模式有什麼好處 ?
1、控制資源的使用,通過線程同步來控制資源的併發訪問;
2、控制實例產生的數量,達到節約資源的目的。
3、作爲通信媒介使用,也就是數據共享,它可以在不建立直接關聯的條件下,讓多個不相關的兩個線程或者進程之間實現通信。
常用的單例模式有兩種:餓漢式、懶漢式。
單例模式的要領:
1.構造方法私有化
2.提供一個公開的靜態的獲取當前類型對象的方法
3.提供一個當前類型的靜態變量
一、懶漢式
在類加載的時候不創建單例實例。只有在第一次請求實例的時候的時候創建,並且只在第一次創建後,以後不再創建該類的實例。
下面爲懶漢式單例代碼示例:

public class Singleton {
    // 提供一個當前類型的靜態變量
    private static Singleton s;
    // 構造方法私有化
    private Singleton() {
    }
    // 提供一個公開的靜態的獲取當前類型對象的方法
    public static Singleton getInstance() {
        if (s == null) {
            s = new Singleton();
        }
        return s;
    }

}

二、餓漢式
在類被加載的時候,唯一實例已經被創建。
下面爲餓漢式單例代碼示例:

/*
 * 餓漢式單例
 */
public class Admin {

    //提供一個當前類型的靜態變量,靜態變量在類加載時創建,而且只執行一次
    private static Admin a = new Admin();
    // 構造方法私有化
    private Admin() {

    }
    // 提供一個公開的靜態的獲取當前類型對象的方法
    public static Admin getInstance() {
        return a;
    }
}

下面爲測試是否是唯一實例:

public class Test {
    public static void main(String[] args) {
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        Admin a1 = Admin.getInstance();
        Admin a2 = Admin.getInstance();
        System.out.println("懶漢式單例測試:"+(s1 == s2));
        System.out.println(s1);
        System.out.println(s1);
        System.out.println("餓漢式單例測試:"+(a1 == a2));
        System.out.println(a1);
        System.out.println(a2);
    }
}

測試結果如圖所示:
這裏寫圖片描述

由圖可知,無論是懶漢式還是餓漢式單例,都取得了唯一實例。


注意:==兩邊如果是基本數據類型,比較的是兩個基本類型的大小是否想等;==兩邊如果是引用數據類型,則比較的是內存地址,內存地址一樣說明取得的是同一個實例。


發佈了28 篇原創文章 · 獲贊 8 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章