最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

android設(shè)計模式之單例模式詳解

 更新時間:2014年04月22日 10:20:46   作者:  
這篇文章主要介紹了android設(shè)計模式中的單例模式詳解,需要的朋友可以參考下

這是我們最常見的一類模式,對這一類模式有一個通用的特點就是:

封裝創(chuàng)建的方式和過程。

這里所謂封裝就是隱藏的意思,對對象的創(chuàng)建方法和過程不可見,或者是虛擬的過程。

隱藏創(chuàng)建方式,就是如單例,工廠方法,隱藏創(chuàng)建過程則是指builder,原型,至于抽象工廠,我認為他包含了以上兩種。

我們想想一個對象的創(chuàng)建有哪些步驟?

1、創(chuàng)建什么東西?--接口定義

2、誰創(chuàng)建?        --決策類or幫助類

3、如何創(chuàng)建?     --how,創(chuàng)建過程

4、什么時候創(chuàng)建?    --創(chuàng)建時機的觸發(fā)

由此可知,創(chuàng)建型就是在上面幾個點做文章

我將單例模式放在最前面來講,是因為簡單和直白。

1、單例模式

gof原文這么講的:

復(fù)制代碼 代碼如下:

Ensure a class only has one instance, and providea global point of access to it

有2點:

a、僅且只能有1個實例

b、提供一個全局訪問點

就是說一個對象只能生成一次,然后可以全局個方法或者類去調(diào)用。

<有事離開,未完待續(xù)>

從上面描述就知道,我們一般在需要只用對象的一個實例的時候才用到這個模式,類似我們常說的全局對象,在j2ee中我們知道默認spring初始化bean的時候都是單例的,我們也可以在配置文件中定義,如下:

復(fù)制代碼 代碼如下:

<bean id="foo" class="foo" singleton="true" />

這告訴spring容器,foo的實例只會生成一次。

那么在android中,有哪些地方用到了單例模式呢?

我們知道一個手機中,打開輸入法,不管在哪打開,其實都是一個實例;Activity.java中有一個mSearchManager的對象它也是單例對象;如果是android原生系統(tǒng),有個全局搜索global,如果看android源碼,你會發(fā)現(xiàn)DisplayManagerGlobal,WindowManagerGlobal等等很多都是單例的,這些對象負責管理整個手機的運行處理。我們來看 WindowManagerGlobal 的實現(xiàn):

復(fù)制代碼 代碼如下:

public static WindowManagerGlobal getInstance() {
        synchronized (WindowManagerGlobal.class) {
            if (sDefaultWindowManager == null) {
                sDefaultWindowManager = new WindowManagerGlobal();
            }
            return sDefaultWindowManager;
        }
    }

這樣系統(tǒng)保證了WindowManagerGlobal 對象的產(chǎn)生只會有一個,在系統(tǒng)調(diào)用(決策對象)需要的時候,調(diào)用getInstance(全局訪問點),來生成new 。這是一個很完整的單例模式的實現(xiàn),一個很好的例子。

mSearchManager的實現(xiàn)也很有意思:

復(fù)制代碼 代碼如下:

private void ensureSearchManager() {
        if (mSearchManager != null) {
            return;
        }

        mSearchManager = new SearchManager(this, null);
    }

這里有人會說怎么這樣嗯,沒返回SearchManager對象啊,就是沒有決策類這個角色。其實他是有的,他的決策類就是我們常用的getSystemService,看代碼:

復(fù)制代碼 代碼如下:

@Override
    public Object getSystemService(String name) {
        if (getBaseContext() == null) {
            throw new IllegalStateException(
                    "System services not available to Activities before onCreate()");
        }

        if (WINDOW_SERVICE.equals(name)) {
            return mWindowManager;
        } else if (SEARCH_SERVICE.equals(name)) {
            ensureSearchManager();
            return mSearchManager;
        }
        return super.getSystemService(name);
    }

其實這里getSystemService我們可以看做一個特殊的決策類,從以下代碼來看:

復(fù)制代碼 代碼如下:

if (SEARCH_SERVICE.equals(name)) {
            ensureSearchManager();
            return mSearchManager;
        }

我們改成:

復(fù)制代碼 代碼如下:

public static SearchManager getInstance(){
     ensureSearchManager();
     return mSearchManager;
}

這就是一個單例模式。但從getSystemService整個代碼來看,確實工廠方法模式,這個我們在下面會講到。

根據(jù)對象創(chuàng)建時機的不同,單例模式有三種方式:

1、餓漢式    --就是實例在類加載的時候就生成

復(fù)制代碼 代碼如下:

public class foo{
        foo(){}
        private static foo instance =new foo();
        public static foo getlnstance(){
           return instance;
        }
}

2、懶漢式

復(fù)制代碼 代碼如下:

public class foo{
        foo(){}
        private static foo instance = null ;
        public static foo getlnstance(){
            if(instance == null){
                instance = new foo();
            }
           return instance;
        }
}

3、注冊式

復(fù)制代碼 代碼如下:

    public static foo getInstance(String name) {
        if(name == null) {
            name = foo .class.getName();
            System.out.println("name == null"+"--->name="+name);
        }
        if(map.get(name) == null) {
            try {
                map.put(name, (foo ) Class.forName(name).newInstance());
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        return map.get(name);
    }


第一種和第二種方式區(qū)別在于創(chuàng)建時機的差異,而第三種則是如何創(chuàng)建有區(qū)別。

最后,問幾個問題:

1、android還有哪些其他的單例模式

2、launcher mode中有沒有單例模式的實現(xiàn)

3、單例模式的拓展中,數(shù)據(jù)庫連接池屬于哪種方式的變異(衍生).

4、三種方式的單例模式的優(yōu)缺點有哪些?一般用途區(qū)別在哪?。

相關(guān)文章

  • android 傳感器(OnSensorChanged)使用介紹

    android 傳感器(OnSensorChanged)使用介紹

    當傳感器的值發(fā)生變化時,例如磁阻傳感器方向改變時會調(diào)用OnSensorChanged(). 當傳感器的精度發(fā)生變化時會調(diào)用OnAccuracyChanged()方法
    2014-11-11
  • Android String類型轉(zhuǎn)換為float、double和int的工具類方法

    Android String類型轉(zhuǎn)換為float、double和int的工具類方法

    今天小編就為大家分享一篇Android String類型轉(zhuǎn)換為float、double和int的工具類方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Android TagCloudView云標簽的使用方法

    Android TagCloudView云標簽的使用方法

    這篇文章主要為大家詳細介紹了Android TagCloudView云標簽的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Android Studio實現(xiàn)補間動畫

    Android Studio實現(xiàn)補間動畫

    這篇文章主要為大家詳細介紹了Android Studio實現(xiàn)補間動畫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Android集成Unity的兩種方案

    Android集成Unity的兩種方案

    現(xiàn)在市面上的形形色色Android客戶端,為了更優(yōu)的用戶體驗,我們開發(fā)的上游產(chǎn)品和交互往往會在界面里設(shè)計很多動效,傳統(tǒng)的一頁頁的靜態(tài)展示頁面已經(jīng)不足以滿足用戶的審美需求了,本文將給大家分享Android集成Unity的兩種方案,感興趣的朋友可以參考下
    2024-05-05
  • OKhttp攔截器實現(xiàn)實踐環(huán)節(jié)源碼解析

    OKhttp攔截器實現(xiàn)實踐環(huán)節(jié)源碼解析

    這篇文章主要為大家介紹了OKhttp攔截器實現(xiàn)實踐環(huán)節(jié)源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Android強制設(shè)定橫屏時,SurfaceView一直黑屏

    Android強制設(shè)定橫屏時,SurfaceView一直黑屏

    本文主要介紹了Android強制設(shè)定橫屏時,SurfaceView一直黑屏的方法。具有一定的參考作用,下面跟著小編一起來看下吧
    2017-01-01
  • 詳解Android WebView加載html片段

    詳解Android WebView加載html片段

    本篇文章主要介紹了詳解Android WebView加載html片段,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Kotlin中Object關(guān)鍵字的使用示例介紹

    Kotlin中Object關(guān)鍵字的使用示例介紹

    在Kotlin中object是一個特殊的關(guān)鍵字。主要用于聲明一個類的同時創(chuàng)建這個類的對象(例如單例)。在Kotlin中它有三個方面的應(yīng)用:對象表達式,對象聲明和伴生對象
    2022-09-09
  • 使用Glide實現(xiàn)高斯模糊效果

    使用Glide實現(xiàn)高斯模糊效果

    這篇文章主要為大家詳細介紹了使用Glide實現(xiàn)高斯模糊效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12

最新評論

大理市| 紫云| 西充县| 获嘉县| 神木县| 大名县| 平潭县| 江口县| 景洪市| 榆林市| 石嘴山市| 江山市| 中方县| 清丰县| 红原县| 城固县| 黔江区| 永城市| 磐安县| 科技| 五家渠市| 宝清县| 彭水| 潼关县| 益阳市| 通许县| 杭州市| 阿图什市| 博乐市| 昌宁县| 神农架林区| 湘乡市| 延庆县| 上林县| 昔阳县| 大埔县| 商都县| 平塘县| 张家口市| 江油市| 察哈|