設(shè)計模式之單例模式

什么是設(shè)計模式: 被反復使用,代碼設(shè)計經(jīng)驗的總結(jié)

使用設(shè)計模式目的: 代碼的重用拣挪,讓代碼更易于理解擦酌,保證代碼可靠性

概念

  • 單例對象的類必須保證只有一個實例存在。

適合場景

  • 整個系統(tǒng)只需要擁有一個的全局對象菠劝。

分類

  • 懶漢式:指全局的單例實例在第一次被使用時構(gòu)建
  • 餓漢式:指全局的單例實例在類裝載時構(gòu)建
  • 靜態(tài)內(nèi)部類: 在靜態(tài)內(nèi)部類中聲明一個instance

步驟

  1. 構(gòu)造器私有化
  2. 創(chuàng)建類的唯一實例赊舶,使用private static 修飾
  3. 提供一個獲取實例的public方法
  4. enum枚舉

餓漢式(線程安全)

class Singleton{
  //類加載時創(chuàng)建instance
  private static Singleton instance = new Singleton();

  private Singleton(){
  }

  public Singleton getInstance(){
    return instance;
  }

}

懶漢式

class Singleton{
  //僅僅聲明instance
  private static Singleton instance ;

  private Singleton(){
  }

  public Singleton getInstance(){
    if(instance==null){
        instance = new Singleton();
    }
    return instance;
  }

}

上面這種getInstance有致命的缺陷,就是無法保證線程安全赶诊。而給整個方法加synchronized效率不高笼平。考慮到同步操作只需要在第一次調(diào)用時才被需要舔痪,即第一次創(chuàng)建單例實例對象時寓调。這就引出了雙重檢驗鎖

雙重檢驗鎖

是一種使用同步塊加鎖的方法锄码。程序員稱其為雙重檢查鎖夺英,因為會有兩次檢查 instance == null,一次是在同步塊外滋捶,一次是在同步塊內(nèi)痛悯。為什么在同步塊內(nèi)還要再檢驗一次?因為可能會有多個線程一起進入同步塊外的 if重窟,如果在同步塊內(nèi)不進行二次檢驗的話就會生成多個實例了载萌。

  public Singleton getInstance(){
    if(instance==null){
      synchronized(Singleton.class){
          if(instance==null)
              instance = new Singleton();
      }
    }
    return instance;
  }

靜態(tài)內(nèi)部類

class Singleton{
  private static class SingletonHolder{//使用私有修飾符
    private static final Singleton instance = new Singleton();
  }
  private Singleton(){}

  public static final Singleton getInstance(){
    return SingletonHolder.instance;
  }
}

這種寫法仍然使用JVM本身機制保證了線程安全問題;由于 SingletonHolder 是私有的亲族,除了 getInstance() 之外沒有辦法訪問它炒考,因此它是懶漢式的可缚;同時讀取實例的時候不會進行同步霎迫,沒有性能缺陷;也不依賴 JDK 版本帘靡。

枚舉

enum Dog {
    DogA(1, "dog1"),DogB(2,"dog2");//實例

    int age;//私有變量
    String name;

    Dog(int age, String name) {//構(gòu)造方法
        this.age = age;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}
//調(diào)用
public static void main(String[] args) {
      Dog dog = Dog.DogA;
      System.out.println(dog);

  }

總結(jié)

  • 4種方式推薦使用后兩種知给,其中枚舉最適合,同時也最難理解描姚。

參考資料

我的博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涩赢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子轩勘,更是在濱河造成了極大的恐慌筒扒,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绊寻,死亡現(xiàn)場離奇詭異花墩,居然都是意外死亡悬秉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門冰蘑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來和泌,“玉大人,你說我怎么就攤上這事祠肥∥涿ィ” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵仇箱,是天一觀的道長县恕。 經(jīng)常有香客問我,道長剂桥,這世上最難降的妖魔是什么弱睦? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮渊额,結(jié)果婚禮上况木,老公的妹妹穿的比我還像新娘。我一直安慰自己旬迹,他們只是感情好火惊,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奔垦,像睡著了一般屹耐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上椿猎,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天惶岭,我揣著相機與錄音,去河邊找鬼犯眠。 笑死按灶,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的筐咧。 我是一名探鬼主播鸯旁,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼量蕊!你這毒婦竟也來了铺罢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤残炮,失蹤者是張志新(化名)和其女友劉穎韭赘,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體势就,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡泉瞻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年楷怒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓦灶。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸠删,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贼陶,到底是詐尸還是另有隱情刃泡,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布碉怔,位于F島的核電站烘贴,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏撮胧。R本人自食惡果不足惜桨踪,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望芹啥。 院中可真熱鬧锻离,春花似錦、人聲如沸墓怀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽傀履。三九已至虱朵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钓账,已是汗流浹背碴犬。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留梆暮,地道東北人服协。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像惕蹄,于是被迫代替她去往敵國和親蚯涮。 傳聞我的和親對象是個殘疾皇子治专,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容