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

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

                  
          return stOne;
              }

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

          二:線程安全
           1class singletonTwo
           2{
           3    //靜態變量
           4    private static singletonTwo stTwo = null;
           5    //私有構造器
           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 當其它類或線程第二次來調用時,減少相應線程開銷
          21    public static singletonTwo getInstanceTwo()
          22    {
          23        if(stTwo == null)
          24        {
          25            synchronized(obj)
          26            {
          27                if(stTwo == null)//此處判斷的作用在于:當第一次初始化時即有多個線程進入第一個   stTwo == null 的判斷塊,同時等待obj的線程釋放。
          28                {
          29                    stTwo = new singletonTwo();
          30                }

          31            }

          32        }

          33        return stTwo;
          34    }

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

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

          }


          //通過靜態代碼塊實例化一個靜態實例
          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這個模式而言,產生的對象是沒有任何區別的。
          //同樣只執行了一次staticStTwo = new staticSingletonTwo(),但輸出的數字卻有戲劇性的區別,staticSingletonOne輸出的為0,1,2,3 而staticSingletonTwo輸出的卻為10,11,12,13。
          //根本原因在于:staticSingletonOne在實例化對象時將 num賦為10,隨后在執行靜態變量初始化時又賦為了0。而在staticSingletonTwo, num 變量與實例化語句同處于靜態變量中,先num=0,然后才賦num=10操作。



          要點:
          1.singleton不要支持序列化,避免出現多個實例,與singleton模式理念沖突
          2.singleton只考慮到了對象的創建管理,沒有考慮到對象的銷毀管理,在支持垃圾回收的平臺下(.net,java),一般不需要考慮對對象銷毀管理作特別的處理。
          3.模式的核心為:控制類的使用者對類的實例方法任意使用并使最終只產生一個實例。
          4.普通實現方法,每次都需要檢查類的對象是否已經存在,增大開銷,建議使用靜態初始化方法。
          posted on 2007-12-28 14:39 Crying 閱讀(248) 評論(0)  編輯  收藏 所屬分類: 模式
          主站蜘蛛池模板: 进贤县| 玛纳斯县| 文成县| 南充市| 广安市| 铜山县| 交城县| 万安县| 绥德县| 涞水县| 延津县| 汶上县| 乌拉特前旗| 山丹县| 永胜县| 泰安市| 城市| 涟源市| 信宜市| 尖扎县| 衡阳市| 五台县| 南木林县| 横山县| 正定县| 永州市| 巴东县| 天峻县| 图木舒克市| 申扎县| 烟台市| 珠海市| 武穴市| 金沙县| 青河县| 高雄市| 平利县| 常德市| 黎川县| 根河市| 正安县|