qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請?jiān)L問 http://qaseven.github.io/

          singleton模式

          這個單例模式一般是只能創(chuàng)建一個實(shí)例的實(shí)現(xiàn),如網(wǎng)絡(luò)游戲里每個特定的地圖,對于任意一個玩家,這個地圖都是唯一的. 其特點(diǎn)是有一個私有的構(gòu)造器和一個公開的獲取實(shí)例的方法。比如:
          
          //這是第一種,叫餓漢模式,無論是否需要,都弄一個出來
          
          
          public class Singleton{
           private static final Singleton st=new Singleton();
           private Singleton(){
           
           }
           public static Singleton getInstance(){
            if(st==null)
            {
              return st;
          
            }
           }
          }
          
          //這是另外一種,叫懶漢模式,你不要我就不給弄,你要了再說.
          
          public class SingleTon{
           private static SingleTon st;
           private SingleTon(){
          
           }
           public static SingleTon getInstance(){
             if (st==null){
               st=new SingleTon();
             }
             return st;
            }
          }
          
          二者在大多數(shù)情況沒區(qū)別,但是餓漢模式是線程安全的,懶漢模式是要加同步鎖的.不同步的話,在這個類的實(shí)例還沒有創(chuàng)建的時候,多個線程同時去調(diào)用getInstance, 這時,由于沒有同步鎖,有可能會創(chuàng)建出多個實(shí)例來。 
          對于餓漢式,由于實(shí)例是在load class的時候創(chuàng)建的,所以就沒有這個問題。 當(dāng)然,除非2個線程采用了不同的class loader. 
          當(dāng)然, 無論餓漢還是懶漢, 幾率都不高, 但幾率低不代表不會出錯, 邏輯上也不對, 因此, 編程者還是應(yīng)該避免。 
          package test;
          
          public class Singleton {
           private Singleton s;
           private Singleton()
           {
            
           }
           public static Singleton getSigleton()
           {
            if(s==null)s=new Singleton();
            return s;
           }
          
           
          }
          這就是一個單例模式,我想應(yīng)該不用注釋了,原理就是這個類的構(gòu)造方法private了,所有在外邊不能調(diào)用,也就不能new Singleton();得到實(shí)例,那么
          想得到實(shí)例就得調(diào)用它的靜態(tài)方法getSigleton();即Singleton.getSigleton();就會返回一個Singleton的實(shí)例,注意此方法中的語句,
          即如果你是第一次調(diào)用這個方法那么它會給你new一個實(shí)例,以后再調(diào)用得到的都是這個實(shí)例,也就是說從始至終就只有一個Singleton的實(shí)例,這就是單例模式。
          1、禁止掉可被調(diào)用的構(gòu)建方法
          2、自動初始化一個實(shí)例
          public class EagerSingleton{
            private static final EagerSingletonst = new EagerSingleton();
            private EagerSingleton(){}
            public static EagerSingletongetInstance(){
              return st;
            }
          }
          
          public class LazySingleton{
            private static LazySingletonst;
            private LazySingleton(){}
            synchronized public static LazySingleton getInstance(){
              if (st==null){
                st = new LazySingleton();
              }
              return st;
            }
          }
          
          
          EagerSingleton比較適合JAVA 

          posted on 2011-09-23 11:29 順其自然EVO 閱讀(147) 評論(0)  編輯  收藏

          <2011年9月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 杭锦后旗| 陕西省| 双江| 宁安市| 建昌县| 河源市| 历史| 安庆市| 正蓝旗| 云浮市| 广汉市| 盐津县| 新河县| 灵川县| 璧山县| 乐都县| 图们市| 兴城市| 长白| 九龙县| 永嘉县| 荃湾区| 昆明市| 利辛县| 邮箱| 拜城县| 龙南县| 克山县| 巴青县| 绥中县| 平邑县| 绥德县| 政和县| 广安市| 清原| 贵德县| 南投市| 阿勒泰市| 石家庄市| 余江县| 铜鼓县|