丄諦啲仇魜ヤ
          如 果 敵 人 讓 你 生 氣 , 那 說 明 你 沒 有 勝 他 的 把 握!
          posts - 6,comments - 56,trackbacks - 1
          來源于http://www.aygfsteel.com/sunsjorlin/archive/2007/12/28/171033.html
          1.保證一個類只有一個實例的機制.
          2.站在類的設(shè)計者的角度,強制使一個類只能有一個實例,而不是站在類的使用者角度。

          一:簡單實現(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 當其它類或線程第二次來調(diào)用時,減少相應(yīng)線程開銷
          21    public static singletonTwo getInstanceTwo()
          22    {
          23        if(stTwo == null)
          24        {
          25            synchronized(obj)
          26            {
          27                if(stTwo == null)//此處判斷的作用在于:當?shù)谝淮纬跏蓟瘯r即有多個線程進入第一個   stTwo == null 的判斷塊,同時等待obj的線程釋放。
          28                {
          29                    stTwo = new singletonTwo();
          30                }

          31            }

          32        }

          33        return stTwo;
          34    }

          35}
          優(yōu)點為:因為實例化語句處于getInstance方法里,即當需要一個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 14:39 Crying 閱讀(248) 評論(0)  編輯  收藏 所屬分類: 模式

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 大兴区| 新安县| 清丰县| 右玉县| 蓬安县| 永吉县| 明溪县| 珲春市| 崇文区| 尤溪县| 塔城市| 闽侯县| 漳浦县| 柳州市| 永定县| 扬中市| 舒城县| 霍城县| 天峨县| 长丰县| 嘉义县| 垫江县| 安庆市| 益阳市| 三原县| 临湘市| 沁源县| 抚州市| 甘孜| 寿宁县| 渑池县| 庆城县| 临潭县| 栾城县| 通州区| 体育| 吴川市| 龙川县| 灌阳县| 古田县| 玉山县|