在講單例模式之前首先要知道什麼是設計模式,那麼什麼是設計模式呢?
百度百科是這樣解釋的:設計模式(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);
}
}
測試結果如圖所示:
由圖可知,無論是懶漢式還是餓漢式單例,都取得了唯一實例。
注意:==兩邊如果是基本數據類型,比較的是兩個基本類型的大小是否想等;==兩邊如果是引用數據類型,則比較的是內存地址,內存地址一樣說明取得的是同一個實例。