久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

設(shè)計(jì)模式讀書筆記-----單例模式

 關(guān)平藏書 2017-07-31

        有時(shí)候某些對象我們只需要一個(gè),如:線程池,、緩存,、對話框等等,對于這類對象我們只能有一個(gè)實(shí)例,,如果我

們制造出多個(gè)實(shí)例,,就會導(dǎo)致很多問題產(chǎn)生。

        但是我們怎樣才能保證一個(gè)類只有一個(gè)實(shí)例并且能夠便于訪問,?這里我們想到了全局變量,,全局變量確實(shí)是可以

保證該類可以隨時(shí)訪問,但是它很難解決只有一個(gè)實(shí)例問題,。最好的辦法就是讓該自身來負(fù)責(zé)保存它的唯一實(shí)例,。這

個(gè)類必須要保證沒有其他類來創(chuàng)建它。這里我們可以將其構(gòu)造方法私有化,。即

1 Public MyClass{
2          PrivateMyClass(){}
3 }

        含有私有化構(gòu)造器的類就能保證它不能被其他類實(shí)例化了。但是我們?nèi)绾蝸慝@取這個(gè)實(shí)例化類呢,?提供一個(gè)方法

用于返回該類的實(shí)例對象即可實(shí)現(xiàn),。

 

復(fù)制代碼
1 public class MyClass {
2     private MyClass(){
3         
4     }
5     
6     public static MyClass getInstance(){
7         return new MyClass();
8     }
9 }
復(fù)制代碼

        一,、基本定義                                                                                                       

 

        通過上面簡單介紹,我們可以對單例模式有一個(gè)簡單的認(rèn)識,。所謂單例模式就是確保某一個(gè)類只有一個(gè)實(shí)例,并

且提供一個(gè)全局訪問點(diǎn),。

        從上面可以看出單例模式有如下幾個(gè)特點(diǎn):

           一,、它只有一個(gè)實(shí)例。

           二,、它必須要自行實(shí)例化,。

           三、它必須自行想整個(gè)系統(tǒng)提供訪問點(diǎn),。

 

        二,、模式結(jié)構(gòu)                                                                                                       

         單例模式可以說是最簡單的設(shè)計(jì)模式了,它僅有一個(gè)角色Singleton,。

         Singleton:單例,。

 

         三、模式實(shí)現(xiàn)                                                                                                       

復(fù)制代碼
 1 public class Singleton {
 2     //利用靜態(tài)變量來記錄Singleton的唯一實(shí)例
 3     private static Singleton uniqueInstance;
 4     
 5     /*
 6      * 構(gòu)造器私有化,,只有Singleton類內(nèi)才可以調(diào)用構(gòu)造器
 7      */
 8     private Singleton(){
 9         
10     }
11     
12     public static Singleton getInstance(){
13         if(uniqueInstance == null){
14             uniqueInstance = new Singleton();
15         }
16         
17         return uniqueInstance;
18     }
19     
20 }
復(fù)制代碼

 

         在《Head  First》有這樣一個(gè)場景,,就是說有兩個(gè)線程都要執(zhí)行這段代碼,很有可能會產(chǎn)生兩個(gè)實(shí)例對象,。如下圖:

         這里有三種解決方案,。

           第一、  使用synchronized來處理,。也就是說將getInstance()方法變成同步方法即可,。

復(fù)制代碼
 1 public class Singleton {
 2     //利用靜態(tài)變量來記錄Singleton的唯一實(shí)例
 3     private static Singleton uniqueInstance;
 4     
 5     /*
 6      * 構(gòu)造器私有化,只有Singleton類內(nèi)才可以調(diào)用構(gòu)造器
 7      */
 8     private Singleton(){
 9         
10     }
11     
12     public static synchronized Singleton getInstance(){
13         if(uniqueInstance == null){
14             uniqueInstance = new Singleton();
15         }
16         
17         return uniqueInstance;
18     }
19     
20 }
復(fù)制代碼

 

          第二,、  直接初始化靜態(tài)變量,。這樣就保證了線程安全。

復(fù)制代碼
 1 public class Singleton {
 2     /*
 3      * 利用靜態(tài)變量來記錄Singleton的唯一實(shí)例
 4      * 直接初始化靜態(tài)變量,,這樣就可以確保線程安全了
 5      */
 6     private static Singleton uniqueInstance = new Singleton();
 7     
 8     /*
 9      * 構(gòu)造器私有化,,只有Singleton類內(nèi)才可以調(diào)用構(gòu)造器
10      */
11     private Singleton(){
12         
13     }
14     
15     public static Singleton getInstance(){
16         return uniqueInstance;
17     }
18     
19 }
復(fù)制代碼

 

           第三、  用“雙重檢查加鎖”,,在getInstance()中減少使用同步,。

復(fù)制代碼
 1 public class Singleton {
 2     /*
 3      * 利用靜態(tài)變量來記錄Singleton的唯一實(shí)例
 4      * volatile 關(guān)鍵字確保:當(dāng)uniqueInstance變量被初始化成Singleton實(shí)例時(shí),,
 5      * 多個(gè)線程正確地處理uniqueInstance變量
 6      * 
 7      */
 8     private volatile static Singleton uniqueInstance;
 9     
10     /*
11      * 構(gòu)造器私有化,只有Singleton類內(nèi)才可以調(diào)用構(gòu)造器
12      */
13     private Singleton(){
14         
15     }
16     
17     /*
18      * 
19      * 檢查實(shí)例,,如果不存在,,就進(jìn)入同步區(qū)域
20      */
21     public static Singleton getInstance(){
22         if(uniqueInstance == null){
23             synchronized(Singleton.class){    //進(jìn)入同步區(qū)域
24                 if(uniqueInstance == null){     //在檢查一次,如果為null,,則創(chuàng)建
25                     uniqueInstance  = new Singleton();
26                 }
27             }
28         }
29         
30         return uniqueInstance;
31     }
32     
33 }
復(fù)制代碼

           在這里是首先檢查是否實(shí)例已經(jīng)創(chuàng)建了,,如果尚未創(chuàng)建,才會進(jìn)行同步,。這樣一來,。只有第一次會同步。

 

           四,、模式優(yōu)缺點(diǎn)                                                                                                     

           優(yōu)點(diǎn)

              一,、節(jié)約了系統(tǒng)資源。由于系統(tǒng)中只存在一個(gè)實(shí)例對象,,對與一些需要頻繁創(chuàng)建和銷毀對象的系統(tǒng)而言,,單

例模式無疑節(jié)約了系統(tǒng)資源和提高了系統(tǒng)的性能。

             二,、因?yàn)閱卫惙庋b了它的唯一實(shí)例,,所以它可以嚴(yán)格控制客戶怎樣以及何時(shí)訪問它。

         缺點(diǎn)

             一,、由于單例模式中沒有抽象層,,因此單例類的擴(kuò)展有很大的困難。

             二,、單例類的職責(zé)過重,,在一定程度上違背了“單一職責(zé)原則”。

 

           五,、模式使用場景                                                                                             

           下列幾種情況可以使用單例模式,。

              一,、系統(tǒng)只需要一個(gè)實(shí)例對象,如系統(tǒng)要求提供一個(gè)唯一的序列號生成器,,或者需要考慮資源消耗太大而只允許創(chuàng)建一個(gè)對象,。

             二、客戶調(diào)用類的單個(gè)實(shí)例只允許使用一個(gè)公共訪問點(diǎn),,除了該公共訪問點(diǎn),,不能通過其他途徑訪問該實(shí)例。

 

           六、總結(jié)                                                                                                           

           1. 單例模式中確保程序中一個(gè)類最多只有一個(gè)實(shí)例,。

           2. 單例模式的構(gòu)造器是私有了,,而且它必須要提供實(shí)例的全局訪問點(diǎn)。

           3. 單例模式可能會因?yàn)槎嗑€程的問題而帶來安全隱患,。

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多