23種設計模式之單例模式

記得剛出來找工作時,面試官問完幾個基礎問題後,基本就會馬上跳到設計模式問我,問我瞭解幾種設計模式.我說單例模式、工廠方法模式、靜態代理模式.他說那你先手寫一個單例模式吧.我立馬拿出筆和紙手寫單例模式,不知道是不是我寫的單例模式面試官不滿意,還是我寫的單例模式和鬼畫符一樣(面試時你回答問題時字跡工整,從某種程度上可以看出你的態度,我覺得我那時的字跡可能給了面試官一種不重視這次面試的感覺吧),總之最後的結果就是出門左拐.那次回去以後我好好的看了看單例模式,但是一直沒有做記錄,心中一直想着念着這件事,今日就了結這件事吧!.

一、爲什麼要使用單例模式

它能夠避免實例對象的重複創建,不僅可以減少每次創建對象的時間開銷,還可以節約內存空間;

能夠避免由於操作多個實例導致的邏輯錯誤;

系統中可能存在一個對象貫穿整個應用程序,此時起到了全局統一管理控制的作用;

二、什麼是單例模式

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.獲取訂單號的工具類(訂單號是唯一的,一個實例產生的訂單號是唯一的,如果多個實例用於產生訂單號,容易導致操作多個實例造成邏輯錯誤

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章