記得剛出來找工作時,面試官問完幾個基礎問題後,基本就會馬上跳到設計模式問我,問我瞭解幾種設計模式.我說單例模式、工廠方法模式、靜態代理模式.他說那你先手寫一個單例模式吧.我立馬拿出筆和紙手寫單例模式,不知道是不是我寫的單例模式面試官不滿意,還是我寫的單例模式和鬼畫符一樣(面試時你回答問題時字跡工整,從某種程度上可以看出你的態度,我覺得我那時的字跡可能給了面試官一種不重視這次面試的感覺吧),總之最後的結果就是出門左拐.那次回去以後我好好的看了看單例模式,但是一直沒有做記錄,心中一直想着念着這件事,今日就了結這件事吧!.
一、爲什麼要使用單例模式
它能夠避免實例對象的重複創建,不僅可以減少每次創建對象的時間開銷,還可以節約內存空間;
能夠避免由於操作多個實例導致的邏輯錯誤;
系統中可能存在一個對象貫穿整個應用程序,此時起到了全局統一管理控制的作用;
二、什麼是單例模式
Singleton是一種創建型模式,指某個類採用Singleton模式,則在這個類被創建後,只可能產生一個實例供外部訪問,並且提供一個全局的訪問點.(簡單來說就是無論程序如何運行,採用單例設計模式的類(Singleton類)永遠只會有一個實例化對象產生)
創建單例模式注意的點:
(1) 將採用單例設計模式的類的構造方法私有化(採用private修飾)。
(2) 在其內部產生該類的實例化對象,並將其封裝成private static類型。
(3) 定義一個公有的獲取實例的靜態方法返回該類的實例。
三、如何使用單例模式
實現的方式有如下四種:
/**
*
* 單例模式的實現:餓漢式,線程安全 但效率比較低
*/
public class SingletonTest {
private SingletonTest() {
}
private static final SingletonTest instance = new SingletonTest();
public static SingletonTest getInstancei() {
return instance;
}
}
/**
* 單例模式的實現:飽漢式,非線程安全
*
*/
public class SingletonTest {
private SingletonTest() {
}
private static SingletonTest instance;
public static SingletonTest getInstance() {
if (instance == null)
instance = new SingletonTest();
return instance;
}
}
/**
* 線程安全,但是效率非常低
* @author vanceinfo
*
*/
public class SingletonTest {
private SingletonTest() {
}
private static SingletonTest instance;
public static synchronized SingletonTest getInstance() {
if (instance == null)
instance = new SingletonTest();
return instance;
}
}
/**
* 線程安全 並且效率高
*
*/
public class SingletonTest {
private static SingletonTest instance;
private SingletonTest() {
}
public static SingletonTest getIstance() {
if (instance == null) {
synchronized (SingletonTest.class) {
if (instance == null) {
instance = new SingletonTest();
}
}
}
return instance;
}
}
四、單例模式使用場景
1.日期工具類獲取當前時間.(在做某些業務操作時,經常要設置更新時間,我們不可能每次都去new 當前時間,因爲頻繁的創建對象會耗費內存.一般都是將日期工具類設置成單例模式,每次需要獲取當前時間時,就去獲取,這樣全局只有一個實例)
2.獲取訂單號的工具類(訂單號是唯一的,一個實例產生的訂單號是唯一的,如果多個實例用於產生訂單號,容易導致操作多個實例造成邏輯錯誤)