Java 單例模式——漂亮學姐要我電話號碼幹什麼?這麼關心我難道她想.

neuyu發表於2021-09-09

圖片描述


小故事引入(保證以後你會追我的文章)

哇!大學開學第一天,我的高中學習沒有白努力,沒有荒廢時光,我考到了一所很好的大學 —— 丞緒源大學!剛入學第一天,走進學校,大家都在忙著自己的事情,席不瑕暖。

我剛進學校,不知道幹什麼,忽然,一位穿一身翠綠衣衫,皮膚雪白,一張臉蛋清秀可愛的學姐走到我面前,她說:“這位弟弟,我可以幫到你什麼?”,我一直呆呆地看著,心裡打量著她,心想 “好生漂亮的女子,千秋無絕色!悅目是佳人!傾國傾城貌!驚為天下人!”。

“這位弟弟,你在想什麼呢?”,她朝我揮揮手,讓我好尷尬,臉紅心跳地答道,“我找宿舍和教學樓,請問在哪兒呢?”,說罷,她直接牽著我的手走去,我頓時不知所措,因為我連女孩子的手都沒碰過!“吶!這裡就是宿舍了,我不方便上去,我在下面等你,為了表達你對我的謝意,就把電話號碼給我吧!”,我便把電話號碼給她了,心裡那叫一個爽。

“我看你準備的東西也不齊全,連被子都沒有,估計飯卡也沒有辦吧,晚上我帶你去吃飯吧,吃完晚飯我帶你去找學校外面的酒店,將就一晚上吧!”,漂亮的學姐說道…

下一篇接著講故事:


學姐的單例模式

使用單例模式的本意是 保證類在記憶體中只能有一個物件 ,單例模式有兩種,一個是餓漢式,一個是懶漢式!

假設學校給學姐分配任務:幫助學弟解決問題!


學姐的餓漢式單例模式

建立一個漂亮學姐(姐姐)類:

/**
 * @author 程憶難 https://myhub.blog.csdn.net
 * 餓漢式
 */
public class BeautifulSister {

    /**
     * 建立例項,並且是私有的
     */
    private static final BeautifulSister beautifulSister = new BeautifulSister();

    /**
     * 私有構造
     */
    private BeautifulSister() {
        
    }
    
    /**
     * 提供 public get方法,供外部使用
     *
     * @return
     */
    public static BeautifulSister getBeautifulSister() {
        return beautifulSister;
    }
}

此時,如果你要呼叫的話,只能直接用類名呼叫getBeautifulSister()方法,才能獲得這位漂亮學姐,你別再想new她,new急了她給你報錯!也就是這樣,保證類在記憶體中只能有這一個漂亮學姐!這就好比在 丞緒源大學(記憶體) 中,只有這一位漂亮學姐(BeautifulSister類)!

餓漢式是以空間換時間的方式,這就好比在這所大學,已經給定了這位學姐,她要幫助她的學弟,也就是我,這是已經給定的,直接全載入出來!


學姐的懶漢式單例模式

建立一個漂亮學姐(姐姐)類:

/**
 * @author 程憶難 https://myhub.blog.csdn.net
 * 餓漢式
 */
public class BeautifulSister {

    /**
     * 建立例項,並且是私有的
     */
    private static BeautifulSister beautifulSister = null;

    /**
     * 私有構造
     */
    private BeautifulSister() {

    }

    /**
     * 提供 public get方法,供外部使用
     *
     * @return
     */
    public static BeautifulSister getBeautifulSister() {

        if (null == beautifulSister) {
            beautifulSister = new BeautifulSister();
        }

        return beautifulSister;
    }
}

懶漢式,只有當呼叫getBeautifulSister() 方法時,才會建立這位漂亮學姐,故事中提到“她直接牽著我的手走去,我頓時不知所措”,這也是在簡單瞭解之後,知道了我要幹什麼,有什麼疑問後,才拉我的手,總不能上來什麼話也沒說,直接就拉我的手,要我的電話號碼!

那麼如何保證懶漢式單例模式執行緒安全呢,意思就是保證這個學姐不受其他人的干擾,專心為我找宿舍和教學樓,要電話號碼!總不能,同時服務兩個學弟!這就構成了3P,線上程中是不安全的!那麼,就要用到雙重加鎖來解決這一問題!

現在來對獲取這位學姐進行雙重檢查加鎖!

/**
 * @author 程憶難 https://myhub.blog.csdn.net
 * 餓漢式
 */
public class BeautifulSister {

    /**
     * 建立例項,並且是私有的
     */
    private static BeautifulSister beautifulSister = null;

    /**
     * 私有構造
     */
    private BeautifulSister() {

    }

    /**
     * 提供 public get方法,供外部使用
     * 雙重檢查
     *
     * @return
     */
    public static BeautifulSister getBeautifulSister() {

        if (null == beautifulSister) {
            synchronized (BeautifulSister.class) {
                if (null == beautifulSister) {
                    beautifulSister = new BeautifulSister();
                }
            }
        }

        return beautifulSister;
    }
}

這樣就保證了這位學姐先專心致志為我服務!避免了爭風吃醋!


漂亮學姐的傻白甜總結

  • 單例模式保證了系統記憶體中該類只存在一個物件,節省了系統資源,對於一些需要頻繁建立銷燬的物件,使用單例模式可以提高系統效能!
  • 單例模式,採用了私有化構造方法,不可以new學姐(物件),只能用類名呼叫 get() 方法!
  • 單例模式可以用於頻繁地銷燬、創造物件或者建立物件消耗資源過多時候使用!

本篇文章所提及大學名子為本人自擬,如有雷同,純屬巧合!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4550/viewspace-2825123/,如需轉載,請註明出處,否則將追究法律責任。

相關文章