一顆開花的樹

          談笑但看風(fēng)云起,龍騰尚待驚蟄春.

           

          創(chuàng)建型模式----單件模式--singleton

          1.保證一個(gè)類只有一個(gè)實(shí)例的機(jī)制.
          2.站在類的設(shè)計(jì)者的角度,強(qiáng)制使一個(gè)類只能有一個(gè)實(shí)例,而不是站在類的使用者角度。

          一:簡(jiǎn)單實(shí)現(xiàn)
          //簡(jiǎn)單模式
          class singletonOne
          {
              
          //靜態(tài)變量
              private static singletonOne stOne = null;
              
          //私有構(gòu)造器
              private singletonOne(){}
              
          //獲取實(shí)例方法
              public static singletonOne getInstance()
              
          {
                  
          if(stOne == null)
                  
          {
                      stOne 
          = new singletonOne();
                  }

                  
          return stOne;
              }

          }
          優(yōu)點(diǎn)是簡(jiǎn)單,清淅明了。缺點(diǎn)是在多線程環(huán)境下不能保證只實(shí)例化一次。如A,B兩線程,同時(shí)判斷stOne == null 為真,就會(huì)實(shí)例化兩次。

          二:線程安全
           1class singletonTwo
           2{
           3    //靜態(tài)變量
           4    private static singletonTwo stTwo = null;
           5    //私有構(gòu)造器
           6    private singletonTwo(){}
           7    //線程對(duì)象
           8    private static Object obj = new Object();
           9    
          10    //獲取實(shí)例方法1 完全保證線程安全,但增大了不必要的線程開銷
          11    public synchronized static singletonTwo  getInstance()
          12    {
          13        if(stTwo == null)
          14        {
          15            stTwo = new singletonTwo();
          16        }

          17        return stTwo;
          18    }

          19    
          20    //獲取實(shí)例方法2 當(dāng)其它類或線程第二次來(lái)調(diào)用時(shí),減少相應(yīng)線程開銷
          21    public static singletonTwo getInstanceTwo()
          22    {
          23        if(stTwo == null)
          24        {
          25            synchronized(obj)
          26            {
          27                if(stTwo == null)//此處判斷的作用在于:當(dāng)?shù)谝淮纬跏蓟瘯r(shí)即有多個(gè)線程進(jìn)入第一個(gè)   stTwo == null 的判斷塊,同時(shí)等待obj的線程釋放。
          28                {
          29                    stTwo = new singletonTwo();
          30                }

          31            }

          32        }

          33        return stTwo;
          34    }

          35}
          優(yōu)點(diǎn)為:因?yàn)閷?shí)例化語(yǔ)句處于getInstance方法里,即當(dāng)需要一個(gè)singleton實(shí)例時(shí),才會(huì)產(chǎn)生。這種方法稱為惰性實(shí)例化,惰性實(shí)例化避免了在不必要一個(gè)實(shí)例時(shí)產(chǎn)生了實(shí)例對(duì)象。

          三:靜態(tài)初始化
          //直接實(shí)例化一個(gè)靜態(tài)實(shí)例
          class staticSingletonOne
          {
              
          private static staticSingletonOne staticStOne = new staticSingletonOne();
              
          public static int num = 0;
              
              
          private staticSingletonOne()
              
          {
                  num 
          = 10;
              }

              
              
          public static staticSingletonOne getInstance()
              
          {
                  
          return staticStOne;
              }

              
              
          public static void SystemOutNum()
              
          {
                  System.out.println(num
          ++);
              }

              
          public static void main(String[] str)
              
          {
                  staticSingletonOne.SystemOutNum();
                  staticSingletonOne.SystemOutNum();
                  staticSingletonOne.SystemOutNum();
                  staticSingletonOne.SystemOutNum();
              }

          }


          //通過(guò)靜態(tài)代碼塊實(shí)例化一個(gè)靜態(tài)實(shí)例
          class staticSingletonTwo
          {
              
          private static staticSingletonTwo staticStTwo;
              
          public  static int num = 0;
              
              
          private staticSingletonTwo()
              
          {
                  num 
          = 10;
              }

              
              
          static 
              
          {
                  staticStTwo 
          = new staticSingletonTwo();
              }

              
              
          public static staticSingletonTwo getInstance()
              
          {
                  
          return staticStTwo;
              }

              
              
          public static void SystemOutNum()
              
          {
                  System.out.println(num
          ++);
              }

              
              
          public static void main(String[] str)
              
          {
                  staticSingletonTwo.SystemOutNum();
                  staticSingletonTwo.SystemOutNum();
                  staticSingletonTwo.SystemOutNum();
                  staticSingletonTwo.SystemOutNum();
              }

          }


          //此兩個(gè)類對(duì)于 singleton這個(gè)模式而言,產(chǎn)生的對(duì)象是沒有任何區(qū)別的。
          //同樣只執(zhí)行了一次staticStTwo = new staticSingletonTwo(),但輸出的數(shù)字卻有戲劇性的區(qū)別,staticSingletonOne輸出的為0,1,2,3 而staticSingletonTwo輸出的卻為10,11,12,13。
          //根本原因在于:staticSingletonOne在實(shí)例化對(duì)象時(shí)將 num賦為10,隨后在執(zhí)行靜態(tài)變量初始化時(shí)又賦為了0。而在staticSingletonTwo, num 變量與實(shí)例化語(yǔ)句同處于靜態(tài)變量中,先num=0,然后才賦num=10操作。



          要點(diǎn):
          1.singleton不要支持序列化,避免出現(xiàn)多個(gè)實(shí)例,與singleton模式理念沖突
          2.singleton只考慮到了對(duì)象的創(chuàng)建管理,沒有考慮到對(duì)象的銷毀管理,在支持垃圾回收的平臺(tái)下(.net,java),一般不需要考慮對(duì)對(duì)象銷毀管理作特別的處理。
          3.模式的核心為:控制類的使用者對(duì)類的實(shí)例方法任意使用并使最終只產(chǎn)生一個(gè)實(shí)例。
          4.普通實(shí)現(xiàn)方法,每次都需要檢查類的對(duì)象是否已經(jīng)存在,增大開銷,建議使用靜態(tài)初始化方法。

          posted on 2007-12-28 00:34 澤來(lái)-王者之劍 閱讀(1145) 評(píng)論(1)  編輯  收藏 所屬分類: 設(shè)計(jì)模式系列

          評(píng)論

          # re: 創(chuàng)建型模式----單件模式--singleton 2007-12-28 09:05 happycat2007

          You said very good,very detail!  回復(fù)  更多評(píng)論   


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          友情鏈接

          搜索

          最新評(píng)論

          主站蜘蛛池模板: 江北区| 太康县| 上思县| 赤水市| 鹿泉市| 泰来县| 咸宁市| 弥勒县| 通海县| 巴彦淖尔市| 二手房| 台南市| 海城市| 阿城市| 赤城县| 辽阳县| 蛟河市| 台南市| 柳州市| 红河县| 旌德县| 顺义区| 阳春市| 兰溪市| 泽普县| 泰兴市| 隆昌县| 高碑店市| 绥德县| 齐齐哈尔市| 昌黎县| 临湘市| 天柱县| 枞阳县| 邛崃市| 宜丰县| 六安市| 瑞昌市| 龙海市| 玉环县| 方山县|