一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

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

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

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

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

        但是我們?cè)鯓硬拍鼙WC一個(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í)例對(duì)象即可實(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ù)制代碼

        一、基本定義                                                                                                       

 

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

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

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

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

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

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

 

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

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

         Singleton:?jiǎn)卫?/span>

 

         三、模式實(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è)場(chǎng)景,就是說有兩個(gè)線程都要執(zhí)行這段代碼,很有可能會(huì)產(chǎn)生兩個(gè)實(shí)例對(duì)象。如下圖:

         這里有三種解決方案。

           第一、  使用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)建,才會(huì)進(jìn)行同步。這樣一來。只有第一次會(huì)同步。

 

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

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

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

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

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

         缺點(diǎn)

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

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

 

           五、模式使用場(chǎng)景                                                                                             

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

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

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

 

           六、總結(jié)                                                                                                           

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

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

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

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    成人欧美一区二区三区视频| 高清一区二区三区四区五区| 国产色一区二区三区精品视频| 亚洲一区二区三在线播放| 丰满少妇高潮一区二区| 久久黄片免费播放大全| 国产人妻精品区一区二区三区| 午夜视频成人在线观看| 日韩人妻少妇一区二区| 五月婷日韩中文字幕四虎| 少妇特黄av一区二区三区| 国产高清在线不卡一区| 国产内射一级一片内射高清视频 | 国内自拍偷拍福利视频| 日韩欧美精品一区二区三区| 亚洲熟妇熟女久久精品 | 九九热精品视频免费在线播放| 精品人妻av区波多野结依| 亚洲视频偷拍福利来袭| 99在线视频精品免费播放| 国产日韩精品欧美综合区| 日系韩系还是欧美久久| 色婷婷视频免费在线观看| 成人三级视频在线观看不卡| 国产精品涩涩成人一区二区三区| 日本东京热加勒比一区二区| 中文字幕乱码一区二区三区四区| 九九热这里只有免费精品| 少妇一区二区三区精品| 日韩一区二区三区久久| 日韩性生活视频免费在线观看 | 亚洲视频一区二区久久久| 国产福利在线播放麻豆| 日本二区三区在线播放| 性感少妇无套内射在线视频 | 亚洲中文字幕三区四区| 久久精品伊人一区二区| 日本午夜免费观看视频| 亚洲国产91精品视频| 国产成人精品午夜福利av免费| 国产一二三区不卡视频|