日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

【新提醒】設(shè)計模式之一:單例模式

 kiki的號 2017-02-20

     單例模式(Singleton Pattern):
     定義:Ensure a class has only instance , and provide a global point of access to it.(確保某一個類只有一個實例,而且自動實例化并向整個系統(tǒng)提供這個實例)
     優(yōu)點:
     1、在內(nèi)存中只有一個實例,所以減少了內(nèi)存開銷,特別是在一個對象需要頻繁地創(chuàng)建、銷毀時,而且創(chuàng)建或銷毀時性能又無法優(yōu)化。單例模式的優(yōu)勢非常明顯;
     2、避免對資源的多重占用。例如寫文件動作,由于只有個實例存在內(nèi)存中,避免對同一個資源文件的同時寫操作
     3、提供了對唯一實例的受控訪問。
     4、允許可變數(shù)目的實例。
    缺點:
    1、沒有接口,擴展困難。
    2、不適用于變化的對象,如果同一類型的對象總是要在不同的用例場景發(fā)生變化,單例就會引起數(shù)據(jù)的錯誤,不能保存彼此的狀態(tài)。
    3、濫用單例將帶來一些負面問題,如為了節(jié)省資源將數(shù)據(jù)庫連接池對象設(shè)計為的單例類,可能會導(dǎo)致共享連接池對象的程序過多而出現(xiàn)連接池溢出;如果實例化的對象長時間不被利用,系統(tǒng)會認為是垃圾而被回收,這將導(dǎo)致對象狀態(tài)的丟失。
    4、單例類的職責過重,在一定程度上違背了“單一職責原則”。
  
    適用場景:
    1、資源共享的情況下,避免由于資源操作時導(dǎo)致的性能或損耗等。如上述中的日志文件,應(yīng)用配置。
    2、控制資源的情況下,方便資源之間的互相通信。如線程池等。
    3、需要定義大量的靜態(tài)常量和靜態(tài)方法(如工具類)的環(huán)境,可以采用單例模式
   
   UML圖:
     單例模式的幾種書寫方式:
     1.餓漢式單例:單例實例在類裝載時就構(gòu)建  ,
     特點:線程安全   在類加載的同時已經(jīng)創(chuàng)建好一個靜態(tài)對象,調(diào)用時反應(yīng)速度快
     
[AppleScript] 純文本查看 復(fù)制代碼
01
02
03
04
05
06
07
08
09
10
11
12
public class SingletonPattern()[/font][/color]    {
        private static SingletonPattern singleton  = new SingletonPattern();
         
        private SingletonPattern()
        {
        }
        //通過該方法獲得實例對象
        public static SingletonPattern GetSingleton()
        {
             return singleton;
        }
    }
     2、懶漢式單例:單例實例在第一次被使用時構(gòu)建,延遲初始化
     特點:    避免了餓漢式的那種在沒有用到的情況下創(chuàng)建事例,資源利用率高,不執(zhí)行g(shù)etInstance()就不會被實例,可以執(zhí)行該類的其他靜態(tài)方法。但是多個線程判斷instance都為null時,在執(zhí)行new操作時多線程會出現(xiàn)重復(fù)情況
[AppleScript] 純文本查看 復(fù)制代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
public class SingletonPattern()
   {
       private static SingletonPattern singleton  = null;
        
       private SingletonPattern()
       {
       }
       //通過該方法獲得實例對象
       public static SingletonPattern GetSingleton()
       {
           if(singleton == null)
           {
               //多個線程判斷instance都為null時,在執(zhí)行new操作時多線程會出現(xiàn)重復(fù)情況
               singleton = new SingletonPattern ();
           }
            return singleton;
       }
   }
    3、雙重檢測單例:
    特點: 資源利用率高,不執(zhí)行g(shù)etInstance()就不被實例,可以執(zhí)行該類其他靜態(tài)方法 但是第一次加載時反應(yīng)不快
[AppleScript] 純文本查看 復(fù)制代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
public class SingletonPattern()
    {
        private static SingletonPattern singleton  = null;
         
        private SingletonPattern()
        {
        }
        //通過該方法獲得實例對象
        public static SingletonPattern GetSingleton()
        {
            if(singleton == null)
            {
                //使用synchronized關(guān)鍵字,防止多個線程判斷instance都為null時,在執(zhí)行new操作時多線程會出現(xiàn)重復(fù)情況
                synchronized (SingletonPattern.class) {
                                if (instance == null) {
                                        instance = new SingletonPattern();
                                }
                        }
            }
             return singleton;
        }
    }
   4、靜態(tài)內(nèi)部類模式:
[AppleScript] 純文本查看 復(fù)制代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
public class SingletonPattern()
    {
         
        private SingletonPattern()
        {
        }
        private static class SingletonHelp()
        {
            static  SingletonPattern singleton = new SingletonPattern();
        }
        //通過該方法獲得實例對象
        public static SingletonPattern GetSingleton()
        {
     
             return singleton;
        }
    }

    好了,這一章就寫到這,歡迎大家加入QQ群:280993838 。或者關(guān)注我的公眾號:

   

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多