欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

【設計模式與Android】單例模式——獨一無二的皇帝-創(chuàng)新互聯(lián)

什么是單例模式

為利津等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及利津網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為成都做網(wǎng)站、網(wǎng)站建設、外貿營銷網(wǎng)站建設、利津網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!

所謂單例模式,就是確保某一個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例的設計模式。單例模式是最簡單的設計模式,也是應用最廣的設計模式。一般用于避免產(chǎn)生多個對象消耗過多的資源或者某種類型的對象必須獨一無二的情景。

單例模式的實現(xiàn)方式

(1)餓漢式

單例模式極其簡單,僅有一個單例類。既然常用于確保某種類型的對象必須獨一無二的情景,那么我們可以用皇帝來舉例。代碼如下:

public classEmperor {

    //初始化一個皇帝,國不可一日無君
    private static finalEmperor emperor= newEmperor();

    //防止刁民冒充皇帝
    privateEmperor(){}

    public staticEmperor getEmperor(){
        return emperor;
    }

}

從上述代碼中可以看到,類不能通過new的形式構造對象,只能用方法來獲取唯一的靜態(tài)對象。這種在聲明的時候就初始化的實現(xiàn)方式就叫做餓漢式。

(2)懶漢式

與餓漢式不同,懶漢式只有在第一次調用方式時才進行初始化。實現(xiàn)代碼如下:

public classSingleton {

    private staticSingleton instance;

    privateSingleton(){}

    public static synchronizedSingleton getInstance(){
        if(instance== null){
            instance= newSingleton();
        }
        returninstance;
    }

}

懶漢式在方法中添加了synchronized關鍵字,可以在多線程情況下確保單例對象獨一無二。但即使已經(jīng)被初始化,每次調用還會進行同步,會消耗不必要的資源,并且第一次加載時進行實例化會拖慢反應速度,因此懶漢式一般不建議使用。但懶漢式并非一無是處,如果一直沒有人用的話,就不會創(chuàng)建實例,則是節(jié)約空間。這是以時間換空間的實現(xiàn)方式,與餓漢式的以空間換時間各有所長。

還記得語文老師講課外文學知識題的“禪杖就是魯智深,戒刀就是武松,板斧就是李逵”的規(guī)律嗎?注意上面代碼的getIntance()方法,實戰(zhàn)中見到getIntance()就是單例模式的準確率八九不離十。

(3)DCL式

Double Check Lock(以下簡稱DLC)實現(xiàn)單例模式既能夠在需要時才初始化對象,又能保證線程安全。代碼如下:

public classSingleton {

    private staticSingleton instance;

    privateSingleton(){}

    public staticSingleton getInstance(){
        if(instance== null){
            synchronized(Singleton.class){
                if(instance== null){
                    instance= newSingleton();
                }
            }
        }
        returninstance;
    }

}

DCL可以保證無論何時讀取這個變量,都是讀到內存中最新的值,無論何時寫這個變量,都可以立即寫到內存中。DCL是目前單例模式最常見的實現(xiàn)方式。

(4)靜態(tài)內部類式

DCL盡管能完美解決資源消耗、同步多余、線程不安全的問題,卻有低概率在并發(fā)場景比較復雜的情況下失效(少見于J2EE和Hadoop等場景,絕少見于Android場景)。因此在對性能要求極高的情況下我們可以采取靜態(tài)內部類式來實現(xiàn)單例模式。代碼如下:

public classSingleton {

    privateSingleton(){}

    public staticSingleton getInstance(){
        returnSingletonHolder.instance;
    }

    private static classSingletonHolder{
        private static finalSingleton instance= newSingleton();
    }

}

靜態(tài)內部類式利用ClassLoader機制來保證初始化時僅有一個線程,不但不會造成性能損耗,還是天衣無縫的安全方式。

(5)單例模式的容器式管理

還是拿皇帝舉例子,天下可能有多個皇帝,一個軟件也可能有多個單例對象。舉唐玄宗李隆基和大燕皇帝安祿山的對立的例子不是太恰當,畢竟幾乎沒有史書認同安祿山是合法皇帝。我就舉一個大家耳熟能詳?shù)睦印度龂萘x》第80回講述了中國歷史上第一次同時存在兩位被后世的歷史學家認定為合法皇帝(曹丕和劉備)的局面,也是最著名的一次。我們先建立一個管理類:

public classEmperorManager {

    public static finalString WEI= "魏";
    public static finalString SHU= "蜀";
    public static finalString WU= "吳";

    private staticMap<String,Object> emperors= newHashMap<>();

    privateEmperorManager(){}

    public static voidascendEmperor(String key,Object emperor){
        if(!emperors.containsKey(key)){
            emperors.put(key,emperor);
        }
    }

    public staticObject getEmperor(String key){
        returnemperors.get(key);
    }

}

然后就可以管理多個單例對象了:

//曹丕廢帝篡炎劉
EmperorManager.ascendEmperor(EmperorManager.WEI,WeiEmperor.getEmperor());
//漢王正位續(xù)大統(tǒng)
EmperorManager.ascendEmperor(EmperorManager.SHU,ShuEmperor.getEmperor());

幾年后,孫權登基,天下又有了新的皇帝,寫法以此類推。

Android源碼中的單例模式

(1)Application

Application是Android中最典型,也是最常見的單例模式。用戶重寫Application類也只重寫一個。

(2)Activity

Activity在singleInstance啟動模式下只有一個實例,并且這個實例獨立運行在一個Task中,不允許有別的Activity存在,這也是一種單例模式。

(3)Service

Service用bindService()啟動之后,無論再啟動多少次,都只會調用onStartCommand()而不會再調用onCreate(),因為每次調用的Service都是同一對象。

(4)各種Manager

Android中有很多管理類,比如WindowManager、PowerManager、SensorManager、ActivityManager、StorageManager以及ServiceManager等等,這些管理類分別對某些資源進行操作,為了避免對同一資源的同時操作,也為了節(jié)約資源,都采取了單例模式。

(5)UID

在Picasso和Glide等框架流行起來之前,最常見的圖片加載框架非Universal-Image-Loader(以下簡稱UID)莫屬,UID的初始化方式如下:

//全局初始化此配置
ImageLoader.getInstance().init(config);

這里又見到了熟悉的getIntance(),根據(jù)思維定式判定這是單例模式。

Android開發(fā)中如何利用單例模式

(1)當創(chuàng)建一個對象需要較多資源時,比如讀取配置或依賴較多其他對象時,可以用創(chuàng)建一個單例對象常駐內存的方式解決這個問題。

(2)當一個對象需要經(jīng)常調用所以需要反復創(chuàng)建、銷毀時,為了減少內存開支,可以用單例模式來減少創(chuàng)建、銷毀該對象的資源浪費。

(3)當需要對同一個資源進行操作時(例如File I/O),可以創(chuàng)建一個FileManager,這樣內存里只有一個實例,避免了對同一個資源的同時操作。

需要注意的幾個問題

(1)單例模式必然有static修飾符,如果持有Activity的Context,很容易造成OOM,因此盡量使用Application的Context;此外有多少初學者在Activity銷毀時忘記銷毀視頻或地圖的單例對象而吃了大虧?

(2)在不需要獨一無二的對象的時候不要采用單例模式,譬如自定義控件就是最不適合單例模式的場景。

本系列其他博客

【設計模式與Android】建造者模式——建軍大業(yè)

【設計模式與Android】原型模式——復制中心走出來的克隆人

【設計模式與Android】工廠方法模式——化工女神的工廠

【設計模式與Android】抽象工廠模式——嵌合體克隆工廠

【設計模式與Android】策略模式——錦囊里的上策中策下策

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

文章標題:【設計模式與Android】單例模式——獨一無二的皇帝-創(chuàng)新互聯(lián)
文章地址:http://aaarwkj.com/article38/pjspp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供用戶體驗外貿建站、網(wǎng)站設計、網(wǎng)站改版、App開發(fā)網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設
av色狠狠一区二区三区| 午夜福利中文在线观看| 天天日夜夜操人人干人人插| 欧美国产大片一区视频| 97国产免费全部免费观看| 国产伦精品二区三区视频| 日本免费精品一区二区三区四区| 精品国产一区二区三区不卡| 欧美激情网页一区三区| 精品久久久久久久久极品| 亚洲第一精品国产日韩| 日本在线人妻一区二区| 国产精品—色哟哟视频| 亚洲一区二区精品天堂| 欧美一区二区三区精美| 91精品国内手机在线高清| 成人中文字幕av电影| 成年人性生活网站视频| 日本欧美亚洲一区二区三区| 国产高跟丝袜av专区| av天堂最新资源在线| 亚洲第一中文字幕久久| 一本色道久久亚洲综合精品蜜桃| 国产三级传媒在线观看| 琪琪精品免费一区二区三区| 91精品国产91久久综合福利| 亚洲丰满一区二区三区在线| 午夜激情视频在线网站| 日本韩国一级黄色免费| 国产91黑丝在线视频| 美女丝袜诱惑国产在线观看| 激情偷拍一区二区三区视频| 国产高清白丝免费在线观看| 水蜜桃在线观看一区二区国产| 欧美精品一区二区三区在线| 日韩国产欧美一区二区在线视频 | 六月综合激情丁香婷婷色| 欧美丰满人妻少妇视频在线| 国产91在线观看网站| 国产亚洲精品免费视频| 免费精品黑人一区二区三区|