<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    一顆開花的樹

    談笑但看風云起,龍騰尚待驚蟄春.

     

    創建型模式----單件模式--singleton

    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 00:34 澤來-王者之劍 閱讀(1139) 評論(1)  編輯  收藏 所屬分類: 設計模式系列

    評論

    # re: 創建型模式----單件模式--singleton 2007-12-28 09:05 happycat2007

    You said very good,very detail!  回復  更多評論   


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


    網站導航:
     

    導航

    統計

    常用鏈接

    留言簿(4)

    隨筆分類

    隨筆檔案

    友情鏈接

    搜索

    最新評論

    主站蜘蛛池模板: 亚洲国产精品久久久久网站| 亚洲中文字幕无码久久精品1| 亚洲视频精品在线| 中文在线免费看视频| 国产精品亚洲精品日韩已方| 一边摸一边桶一边脱免费视频| 亚洲Aⅴ无码一区二区二三区软件| 国产精品亚洲专区无码牛牛 | 久久久久亚洲AV综合波多野结衣| 老司机免费午夜精品视频| 国产最新凸凹视频免费| 美女扒开屁股让男人桶爽免费 | a级毛片免费全部播放| 亚洲欭美日韩颜射在线二| 三根一起会坏掉的好痛免费三级全黄的视频在线观看 | 久艹视频在线免费观看| 亚洲AV乱码久久精品蜜桃| 久久久久国色av免费看| 亚洲精品一区二区三区四区乱码| 国产高清免费视频| 亚洲人成色99999在线观看| 国产精品视频免费一区二区三区| 日韩色日韩视频亚洲网站| 亚洲综合色在线观看亚洲| 久久国产精品成人免费| 亚洲国产精品综合久久网各| 麻豆国产VA免费精品高清在线 | 国产猛烈高潮尖叫视频免费| 国产精品免费一区二区三区| 亚洲gv猛男gv无码男同短文| 18禁无遮挡无码国产免费网站| 亚洲午夜福利在线视频| 婷婷综合缴情亚洲狠狠尤物| 免费国产99久久久香蕉| 亚洲国产成人精品青青草原| 日韩免费视频播放| 在线观看片免费人成视频播放| 亚洲一区综合在线播放| 性做久久久久免费观看| 两个人看的www高清免费视频| 亚洲国产视频网站|