Singleton與MonoState模式

當(dāng)需要強(qiáng)制要求某個特定對象只能有單一實例時,可以使用Singleton或者M(jìn)onoState模式完成.
首先看下兩種模式的經(jīng)典實現(xiàn)代碼(代碼摘自網(wǎng)絡(luò)http://www.codethinked.com/the-monostate-pattern).

public class Singleton
{
    private static Singleton instance;
 
    private Singleton()
    {
    }
 
    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }
 
    public String DataItem { get; set; }
}
public class Monostate
{
    private static string dataItem;
    public string DataItem
    {
        get { return dataItem; }
        set { dataItem = value; }
    }
 
    public Monostate(){ }
}

對于Singleton模式,關(guān)注的是Structural Constraint,即只有一個實例. 該模式具有以下的優(yōu)勢:

  1. 跨平臺.使用合適的中間件,能夠把該模式擴(kuò)展為跨多個JVM.
  2. 適合于任何類,針對任意普通類,通過簡單的改造都可以成為Singleton的.
  3. 延遲創(chuàng)建.只有在第一次調(diào)用Instance來獲取該單一實例時,才會進(jìn)行實例的創(chuàng)建工作.

而對于該模式也有不少的抱怨, 最大的問題在于類創(chuàng)建方式的不透明性. 假設(shè)現(xiàn)在有一個Service類需要實現(xiàn)為Singleton的, 那么該Service的所有使用者都需要被通知到,要使用Instance方法(getter),而非new的方式來獲取該類的實例.
另一個較為嚴(yán)重的問題是可能的內(nèi)存泄露.如果在Singleton類中持有一些全局資源,那么是沒有合適的時機(jī)進(jìn)行資源釋放的.

MonoState模式部分解決了Singleton模式的缺陷,它關(guān)注的是Behaviour. 該模式具有以下的優(yōu)勢:

  1. 透明性.對于創(chuàng)建者而已,創(chuàng)建MonoState類的實例和創(chuàng)建普通類的實例是一致的(通過new()).這減少了溝通成本.
  2. 可派生性. MonoState的派生類也具有MonoState性的. 這主要是因為子類和父類共享相同的static數(shù)據(jù)域. MonoState的繼承, 可以看做是基于相同數(shù)據(jù)下的行為多態(tài)性的派生.

當(dāng)派生類也需要具有單實例特性時,MonoState模式的優(yōu)勢是巨大的,MonoState子類天生就是MonoState的.
當(dāng)然,MonoState模式也是有爭議的,最大的爭議當(dāng)屬static數(shù)據(jù)域的恰當(dāng)性. 全局static數(shù)據(jù),是導(dǎo)致不少程序Bug的源頭. 其次由于靜態(tài)數(shù)據(jù)是單個JVM作用域內(nèi)的,所以它是不可跨JVM的.

當(dāng)我們需要單實例特性時,如果知會使用者要使用Instance而非new來獲取實例不會造成麻煩,那么Singleton模式會是首選. 而當(dāng)需要保證MonoState是可繼承時,使用MonoState模式是不錯的選擇.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末暇番,一起剝皮案震驚了整個濱河市坤按,隨后出現(xiàn)的幾起案子八千,更是在濱河造成了極大的恐慌哄辣,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挖藏,死亡現(xiàn)場離奇詭異议惰,居然都是意外死亡揽咕,警方通過查閱死者的電腦和手機(jī)意狠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門粟关,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人环戈,你說我怎么就攤上這事闷板。” “怎么了院塞?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵蛔垢,是天一觀的道長。 經(jīng)常有香客問我迫悠,道長,這世上最難降的妖魔是什么巩梢? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任创泄,我火速辦了婚禮,結(jié)果婚禮上括蝠,老公的妹妹穿的比我還像新娘鞠抑。我一直安慰自己,他們只是感情好忌警,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布搁拙。 她就那樣靜靜地躺著秒梳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪箕速。 梳的紋絲不亂的頭發(fā)上酪碘,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音盐茎,去河邊找鬼兴垦。 笑死,一個胖子當(dāng)著我的面吹牛字柠,可吹牛的內(nèi)容都是我干的探越。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼窑业,長吁一口氣:“原來是場噩夢啊……” “哼钦幔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起常柄,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤鲤氢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拐纱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铜异,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年秸架,在試婚紗的時候發(fā)現(xiàn)自己被綠了揍庄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡东抹,死狀恐怖蚂子,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情缭黔,我是刑警寧澤食茎,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站馏谨,受9級特大地震影響别渔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜惧互,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一哎媚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧喊儡,春花似錦拨与、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捻悯。三九已至,卻和暖如春淤毛,著一層夾襖步出監(jiān)牢的瞬間今缚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工钱床, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留荚斯,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓查牌,卻偏偏與公主長得像事期,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子纸颜,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理兽泣,服務(wù)發(fā)現(xiàn),斷路器胁孙,智...
    卡卡羅2017閱讀 134,629評論 18 139
  • 前言 本文主要參考 那些年唠倦,我們一起寫過的“單例模式”。 何為單例模式涮较? 顧名思義稠鼻,單例模式就是保證一個類僅有一個...
    tandeneck閱讀 2,488評論 1 8
  • 1 場景問題# 1.1 讀取配置文件的內(nèi)容## 考慮這樣一個應(yīng)用,讀取配置文件的內(nèi)容狂票。 很多應(yīng)用項目候齿,都有與應(yīng)用相...
    七寸知架構(gòu)閱讀 6,675評論 12 68
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法闺属,內(nèi)部類的語法慌盯,繼承相關(guān)的語法,異常的語法掂器,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • 從三月份找實習(xí)到現(xiàn)在亚皂,面了一些公司,掛了不少国瓮,但最終還是拿到小米灭必、百度、阿里乃摹、京東厂财、新浪、CVTE峡懈、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,209評論 11 349