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

    評論

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

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


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


    網站導航:
     

    導航

    統計

    常用鏈接

    留言簿(4)

    隨筆分類

    隨筆檔案

    友情鏈接

    搜索

    最新評論

    主站蜘蛛池模板: 亚洲乱码精品久久久久..| 麻豆69堂免费视频| 亚洲国产精品无码成人片久久| 成年女人男人免费视频播放 | 免费无码专区毛片高潮喷水| 亚洲日韩看片无码电影| 亚洲理论片在线中文字幕| 亚洲午夜免费视频| 亚洲日本中文字幕| 久久亚洲国产精品五月天| 亚洲一区二区三区偷拍女厕| 亚洲人成色77777在线观看大| 免费永久国产在线视频| 亚洲成a人片在线观看久| 亚洲精品国产精品国自产观看 | 国产AV无码专区亚洲AV男同| 亚洲av无码乱码国产精品| 亚洲熟女少妇一区二区| 国产亚洲老熟女视频| 国产亚洲精品精品国产亚洲综合| 亚洲国产V高清在线观看| 亚洲色偷偷综合亚洲AV伊人| 国产亚洲高清不卡在线观看| 亚洲国产精品一区二区久久| 亚洲福利电影在线观看| 亚洲精品国产精品国自产网站| 亚洲一区在线视频| 久久久久久久久无码精品亚洲日韩| 男女超爽视频免费播放| 国产免费爽爽视频在线观看| 222www免费视频| 免费黄色网址入口| 亚洲色精品aⅴ一区区三区| 亚洲视频在线免费看| AV激情亚洲男人的天堂国语| 国产免费一区二区三区免费视频| 日本在线免费播放| 青草草在线视频永久免费| 亚洲五月午夜免费在线视频| 亚洲一区中文字幕久久| 亚洲成在人线aⅴ免费毛片|