淺談設(shè)計模式一之單例模式

通常我們可以讓一個全局變量使得一個對象被訪問,但它不能防止你實例化多個對象。一個最好的方法就是,讓類自身負(fù)責(zé)保存它的唯一實例。這個類可以保證沒有其他實例可以被創(chuàng)建,并且它可以提供一個訪問該實例的方法。 [DP]

1. 概念

一個實現(xiàn)Singleton類一般擁有以下兩個方法,構(gòu)造函數(shù)Singleton(),以及獲取實例的方法GetInstance()。如下圖所示:

單例結(jié)構(gòu)圖.png

需要注意的是,構(gòu)造方法Singleton()要私有化(用private修飾),獲取實例的方法GetInstance()要設(shè)置為靜態(tài)(static)。

2. 實現(xiàn)方法

  • 懶漢式
//懶漢式單例類.在第一次調(diào)用的時候?qū)嵗约?  
public class Singleton {  
    private Singleton() {}  
    private static Singleton single=null;  
    //靜態(tài)工廠方法   
    public static Singleton getInstance() {  
         if (single == null) {    
             single = new Singleton();  
         }    
        return single;  
    }  
}  
  • 惡漢式
//餓漢式單例類.在類初始化時,已經(jīng)自行實例化   
public class Singleton1 {  
    private Singleton1() {}  
    private static final Singleton1 single = new Singleton1();  
    //靜態(tài)工廠方法   
    public static Singleton1 getInstance() {  
        return single;  
    }  
} 

3. 多線程時的單例模式

在多線程時,一般采用雙重鎖定的方式來實現(xiàn)單例模式

public static Singleton getInstance() {  
        if (singleton == null) {    
            synchronized (Singleton.class) {    
               if (singleton == null) {    
                  singleton = new Singleton();   
               }    
            }    
        }    
        return singleton;   
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容