單例模式

          1.餓漢式單例類(lèi)
          public class Singleton {

            private Singleton(){}

            //在自己內(nèi)部定義自己一個(gè)實(shí)例,是不是很奇怪?
            //注意這是private 只供內(nèi)部調(diào)用

            private static Singleton instance = new Singleton();

            //這里提供了一個(gè)供外部訪(fǎng)問(wèn)本class的靜態(tài)方法,可以直接訪(fǎng)問(wèn)  
            public static Singleton getInstance() {
              return instance;   
             }
          }

          2.懶漢式單例類(lèi)
          public?class?Singleton2?{
          ????
          //私有的默認(rèn)構(gòu)造子
          ????private?Singleton2()?{}
          ????
          ????
          //注意,這里沒(méi)有final????
          ????private?static?Singleton2?single;
          ????
          ????
          //只實(shí)例化一次
          ????static{
          ????????single?
          =?new?Singleton2();
          ????}
          ????
          ????
          //靜態(tài)工廠(chǎng)方法?
          ????public?synchronized??static?Singleton2?getInstance()?{
          ?????????
          if?(single?==?null)?{??
          ?????????????single?
          =?new?Singleton2();
          ?????????}??
          ????????
          return?single;
          ????}
          }
          ??????? 上面給出懶漢式單例類(lèi)實(shí)現(xiàn)里對(duì)靜態(tài)工廠(chǎng)方法使用了同步化,以處理多線(xiàn)程環(huán)境。有些設(shè)計(jì)師在這里建議使用所謂的"雙重檢查成例".必須指出的是,"雙重檢查成例"不可以在Java 語(yǔ)言中使用。不十分熟悉的讀者,可以看看后面給出的小節(jié)。 同樣,由于構(gòu)造子是私有的,因此,此類(lèi)不能被繼承。餓漢式單例類(lèi)在自己被加載時(shí)就將自己實(shí)例化。即便加載器是靜態(tài)的,在餓漢式單例類(lèi)被加載時(shí)仍會(huì)將自己實(shí)例化。單從資源利用效率角度來(lái)講,這個(gè)比懶漢式單例類(lèi)稍差些。從速度和反應(yīng)時(shí)間角度來(lái)講,則比懶漢式單例類(lèi)稍好些。然而,懶漢式單例類(lèi)在實(shí)例化時(shí),必須處理好在多個(gè)線(xiàn)程同時(shí)首次引用此類(lèi)時(shí)的訪(fǎng)問(wèn)限制問(wèn)題,特別是當(dāng)單例類(lèi)作為資源控制器,在實(shí)例化時(shí)必然涉及資源初始化,而資源初始化很有可能耗費(fèi)時(shí)間。這意味著出現(xiàn)多線(xiàn)程同時(shí)首次引用此類(lèi)的機(jī)率變得較大。

          3.單例模式 -- 雙重檢查鎖機(jī)制
          public?class?DoubleLockSingleton?{
          ????private?static?DoubleLockSingleton?instance?=?null;
          ????private?DoubleLockSingleton()?{
          ????}

          ????public static DoubleLockSingleton?getInstance()
          ???{
          ?????if (instance == null)
          ?????{
          ?????? synchronized(DoubleLockSingleton?.class) {? //1
          ???????? if (instance == null)????????? //2
          ?????????? instance = new DoubleLockSingleton?();? //3
          ?????? }
          ???? }
          ???? return instance;
          ???}
          }
          Singleton的好處還在于可以節(jié)省內(nèi)存,因?yàn)樗拗屏?br />實(shí)例的個(gè)數(shù),有利于Java垃圾回收(garbage collection)。
          ?
          4.發(fā)明者是Google公司的Bob lee:
          ?public?? class? Singleton?? {??
          ?
          ?? static?? class? SingletonHolder?? {??
          ???? static? Singleton instance? =?? new? Singleton();??
          ? }???
          ?
          ?? public?? static? Singleton getInstance()?? {??
          ???? return? SingletonHolder.instance;??
          ? }???
          ?
          }

          posted on 2010-01-14 22:55 飛熊 閱讀(222) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): java設(shè)計(jì)模式

          <2010年1月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(1)

          隨筆分類(lèi)

          隨筆檔案

          文章分類(lèi)

          文章檔案

          收藏夾

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 谢通门县| 清水河县| 岱山县| 五台县| 四子王旗| 罗甸县| 牙克石市| 太和县| 许昌县| 略阳县| 乐都县| 社会| 游戏| 阿克| 永胜县| 旬邑县| 黔江区| 肇庆市| 宝丰县| 肇州县| 哈巴河县| 杨浦区| 临城县| 莫力| 老河口市| 井冈山市| 巴里| 泾川县| 许昌市| 宁强县| 乌拉特后旗| 柯坪县| 泗阳县| 墨竹工卡县| 石台县| 凤台县| 南乐县| 中方县| 武胜县| 宁南县| 米易县|