国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Android - android設計模式之單例模式詳解

android設計模式之單例模式詳解

2021-03-01 16:01Android開發網 Android

這篇文章主要介紹了android設計模式中的單例模式詳解,需要的朋友可以參考下

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

封裝創建的方式和過程。

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

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

我們想想一個對象的創建有哪些步驟?

1、創建什么東西?--接口定義

2、誰創建?        --決策類or幫助類

3、如何創建?     --how,創建過程

4、什么時候創建?    --創建時機的觸發

由此可知,創建型就是在上面幾個點做文章

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

1、單例模式

gof原文這么講的:

復制代碼 代碼如下:

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

 

有2點:

a、僅且只能有1個實例

b、提供一個全局訪問點

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

<有事離開,未完待續>

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

 

復制代碼 代碼如下:

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

 

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

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

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

 

復制代碼 代碼如下:

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

 

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

mSearchManager的實現也很有意思:

 

復制代碼 代碼如下:

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

        mSearchManager = new SearchManager(this, null);
    }

 

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

 

復制代碼 代碼如下:


@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我們可以看做一個特殊的決策類,從以下代碼來看:

 

復制代碼 代碼如下:

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

 

我們改成:

 

復制代碼 代碼如下:

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

 

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

根據對象創建時機的不同,單例模式有三種方式:

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

 

復制代碼 代碼如下:

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

 

2、懶漢式

 

復制代碼 代碼如下:

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

 

3、注冊式

 

復制代碼 代碼如下:

    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);
    }

 


第一種和第二種方式區別在于創建時機的差異,而第三種則是如何創建有區別。

最后,問幾個問題:

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

2、launcher mode中有沒有單例模式的實現

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

4、三種方式的單例模式的優缺點有哪些?一般用途區別在哪?。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 免费网站看v片在线a | 亚洲网站在线 | 色九九 | 在线一级片 | 日韩免费 | 色av成人| 久久综合伊人 | 99精品国产高清一区二区麻豆 | 亚洲国产精品一区久久av篠田 | 蜜桃精品在线 | 中文在线а√在线8 | 精品国产黄a∨片高清在线 久草.com | 免费在线看a | 中文字幕日韩一区二区不卡 | 青青草一区二区 | 中文字幕三区 | 久久综合九色综合欧美狠狠 | 中文字幕在线三区 | 中文av在线播放 | 日韩精品免费 | 亚洲高清色综合 | 黄色a视频 | 精品国产青草久久久久福利 | 欧美激情在线观看 | 狠狠综合久久 | 日韩国产精品一区二区三区 | 久久精品国产99国产精2020新增功能 | 久久久国产一区二区 | 亚洲午夜精品视频 | 国产美女在线观看 | 色偷偷888欧美精品久久久 | 亚洲视频精品在线观看 | 久久久久久亚洲 | 在线免费观看毛片 | 国产精品一二三区 | 99成人| 免费在线看a | 国产精品亲子伦av一区二区三区 | 黑人av| 91精品蜜臀在线一区尤物 | 免费a视频在线观看 |