單例模式

參考自百度百科

動機

對于系統(tǒng)中的某些類來說建车,只有一個實例很重要丹喻,例如襟铭,一個系統(tǒng)中可以存在多個打印任務碌奉,但是只能有一個正在工作的任務;一個系統(tǒng)只能有一個窗口管理器或文件系統(tǒng)寒砖;一個系統(tǒng)只能有一個計時工具或ID(序號)生成器赐劣。如在Windows中就只能打開一個任務管理器。如果不使用機制對窗口對象進行唯一化哩都,將彈出多個窗口魁兼,如果這些窗口顯示的內容完全一致,則是重復對象漠嵌,浪費內存資源咐汞;如果這些窗口顯示的內容不一致,則意味著在某一瞬間系統(tǒng)有多個狀態(tài)儒鹿,與實際不符化撕,也會給用戶帶來誤解,不知道哪一個才是真實的狀態(tài)约炎。因此有時確保系統(tǒng)中某個對象的唯一性即一個類只能有一個實例非常重要植阴。

如何保證一個類只有一個實例并且這個實例易于被訪問呢蟹瘾?定義一個全局變量可以確保對象隨時都可以被訪問,但不能防止我們實例化多個對象掠手。一個更好的解決辦法是讓類自身負責保存它的唯一實例憾朴。這個類可以保證沒有其他實例被創(chuàng)建,并且它可以提供一個訪問該實例的方法喷鸽。這就是單例模式的模式動機众雷。

要點

顯然單例模式的要點有三個;一是某個類只能有一個實例做祝;二是它必須自行創(chuàng)建這個實例报腔;三是它必須自行向整個系統(tǒng)提供這個實例。
從具體實現(xiàn)角度來說剖淀,就是以下三點:一是單例模式的類只提供私有的構造函數(shù)纯蛾,二是類定義中含有一個該類的靜態(tài)私有對象,三是該類提供了一個靜態(tài)的公有的函數(shù)用于創(chuàng)建或獲取它本身的靜態(tài)私有對象纵隔。

優(yōu)缺點

優(yōu)點

一翻诉、實例控制
單例模式會阻止其他對象實例化其自己的單例對象的副本,從而確保所有對象都訪問唯一實例捌刮。
二碰煌、靈活性
因為類控制了實例化過程,所以類可以靈活更改實例化過程绅作。

缺點

一芦圾、開銷
雖然數(shù)量很少,但如果每次對象請求引用時都要檢查是否存在類的實例俄认,將仍然需要一些開銷个少。可以通過使用靜態(tài)初始化解決此問題眯杏。
二夜焦、可能的開發(fā)混淆
使用單例對象(尤其在類庫中定義的對象)時,開發(fā)人員必須記住自己不能使用new關鍵字實例化對象岂贩。因為可能無法訪問庫源代碼茫经,因此應用程序開發(fā)人員可能會意外發(fā)現(xiàn)自己無法直接實例化此類。
三萎津、對象生存期
不能解決刪除單個對象的問題卸伞。在提供內存管理的語言中(例如基于.NET Framework的語言),只有單例類能夠導致實例被取消分配锉屈,因為它包含對該實例的私有引用荤傲。在某些語言中(如 C++),其他類可以刪除對象實例部念,但這樣會導致單例類中出現(xiàn)懸浮引用弃酌。

實例

當一個類的實例可以有且只可以一個的時候就需要用到了氨菇。為什么只需要有一個呢?有人說是為了節(jié)約內存妓湘,但這只是單例模式帶來的一個好處查蓉。只有一個實例確實減少內存占用,可是我認為這不是使用單例模式的理由榜贴。我認為使用單例模式的時機是當實例存在多個會引起程序邏輯錯誤的時候豌研。比如類似有序的號碼生成器這樣的東西,怎么可以允許一個應用上存在多個呢唬党?
Singleton模式主要作用是保證在Java應用程序中鹃共,一個類Class只有一個實例存在。
一般Singleton模式通常有三種形式:
第一種形式:懶漢式驶拱,也是常用的形式霜浴。

public class SingletonClass{
    private static SingletonClass instance=null;
    public static synchronized SingletonClass getInstance(){
        if(instance==null){
               instance=new SingletonClass();
        }
        return instance;
    }
    private SingletonClass(){
    }
}

第二種形式:餓漢式

//對第一行static的一些解釋
// java允許我們在一個類里面定義靜態(tài)類。比如內部類(nested class)蓝纲。
//把nested class封閉起來的類叫外部類阴孟。
//在java中,我們不能用static修飾頂級類(top level class)税迷。
//只有內部類可以為static永丝。
public class Singleton{
    //在自己內部定義自己的一個實例,只供內部調用
    private static final Singleton instance = new Singleton();
    private Singleton(){
        //do something
    }
    //這里提供了一個供外部訪問本class的靜態(tài)方法箭养,可以直接訪問
    public static Singleton getInstance(){
        return instance;
    }
}

第三種形式: 雙重鎖的形式慕嚷。

public class Singleton{
    private static volatile Singleton instance=null;
    private Singleton(){
        //do something
    }
    public static  Singleton getInstance(){
        if(instance==null){
            synchronized(SingletonClass.class){
                if(instance==null){
                    instance=new Singleton();
                }
            }
        }
        return instance;
     }
}
//這個模式將同步內容下方到if內部,提高了執(zhí)行的效率毕泌,不必每次獲取對象時都進行同步喝检,只有第一次才同步,創(chuàng)建了以后就沒必要了懈词。
//這種模式中雙重判斷加同步的方式蛇耀,比第一個例子中的效率大大提升,因為如果單層if判斷坎弯,在服務器允許的情況下,
//假設有一百個線程译暂,耗費的時間為100*(同步判斷時間+if判斷時間)抠忘,而如果雙重if判斷,100的線程可以同時if判斷外永,理論消耗的時間只有一個if判斷的時間崎脉。
//所以如果面對高并發(fā)的情況,而且采用的是懶漢模式伯顶,最好的選擇就是雙重判斷加同步的方式囚灼。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末骆膝,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子灶体,更是在濱河造成了極大的恐慌阅签,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝎抽,死亡現(xiàn)場離奇詭異政钟,居然都是意外死亡,警方通過查閱死者的電腦和手機樟结,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門养交,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瓢宦,你說我怎么就攤上這事碎连。” “怎么了驮履?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵破花,是天一觀的道長。 經常有香客問我疲吸,道長座每,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任摘悴,我火速辦了婚禮峭梳,結果婚禮上,老公的妹妹穿的比我還像新娘蹂喻。我一直安慰自己葱椭,他們只是感情好,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布口四。 她就那樣靜靜地躺著孵运,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蔓彩。 梳的紋絲不亂的頭發(fā)上治笨,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音赤嚼,去河邊找鬼旷赖。 笑死,一個胖子當著我的面吹牛更卒,可吹牛的內容都是我干的等孵。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼蹂空,長吁一口氣:“原來是場噩夢啊……” “哼俯萌!你這毒婦竟也來了果录?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤咐熙,失蹤者是張志新(化名)和其女友劉穎弱恒,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體糖声,經...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡斤彼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蘸泻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琉苇。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖悦施,靈堂內的尸體忽然破棺而出并扇,到底是詐尸還是另有隱情,我是刑警寧澤抡诞,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布穷蛹,位于F島的核電站,受9級特大地震影響昼汗,放射性物質發(fā)生泄漏肴熏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一顷窒、第九天 我趴在偏房一處隱蔽的房頂上張望蛙吏。 院中可真熱鬧,春花似錦鞋吉、人聲如沸鸦做。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泼诱。三九已至,卻和暖如春赊锚,著一層夾襖步出監(jiān)牢的瞬間治筒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工改抡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留矢炼,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓阿纤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親夷陋。 傳聞我的和親對象是個殘疾皇子欠拾,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內容