一顆開花的樹

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

           

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

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

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

                  
          return stOne;
              }

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

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

          17        return stTwo;
          18    }

          19    
          20    //獲取實例方法2 當(dāng)其它類或線程第二次來調(diào)用時,減少相應(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即有多個線程進(jìn)入第一個   stTwo == null 的判斷塊,同時等待obj的線程釋放。
          28                {
          29                    stTwo = new singletonTwo();
          30                }

          31            }

          32        }

          33        return stTwo;
          34    }

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

          三:靜態(tài)初始化
          //直接實例化一個靜態(tài)實例
          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();
              }

          }


          //通過靜態(tài)代碼塊實例化一個靜態(tài)實例
          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();
              }

          }


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



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

          posted on 2007-12-28 00:34 澤來-王者之劍 閱讀(1142) 評論(1)  編輯  收藏 所屬分類: 設(shè)計模式系列

          評論

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

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


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


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

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          友情鏈接

          搜索

          最新評論

          主站蜘蛛池模板: 拜城县| 水富县| 山西省| 锦州市| 武安市| 永昌县| 瑞安市| 岳西县| 资兴市| 文成县| 东阳市| 恭城| 荔波县| 太康县| 临澧县| 德化县| 西盟| 云安县| 巴林右旗| 永登县| 玉环县| 凉山| 辽阳市| 建始县| 峨山| 吴江市| 建瓯市| 永川市| 炉霍县| 民勤县| 大埔区| 海宁市| 奉化市| 萝北县| 垦利县| 禹城市| 三明市| 乡宁县| 阳高县| 望谟县| 鹤峰县|