AndroidステップアップシリーズのソースコードSDK単例モード運用


また悲しい时になって、ソースの魅力は、ソースの海を飞ぶ时だけ発见することができます.彼女の美しさ、彼女のセクシーさ、彼女のあでやかさに驚いた.はい、彼女です.
ソースコードを見る前に、黒いソースコードの中でその光を見つけるには、単一のモードについて十分な理解があるはずです.単例モードは,その名前のように何度もインスタンス化する必要はなく,一度でよい.
では、単例モードはいくつあるのでしょうか.変異を除いたものは約5種類ある.単純単例モード、餓漢単例モード、DLC単例モード、内部類単例モード、列挙類単例モード.これらの変異の単例はまだたくさんありますが、一つ一つ例を挙げません.
では、コードをつけます.単純単例モード
package com.example.administrator.singleinstance;

import android.util.Log;

/**
 * Created by Administrator on 2016/12/26.
 */

public class SimpleInstance extends Instance{
    public SimpleInstance(){}
    private static SimpleInstance INSTANCE;

    public static SimpleInstance getInstance(){
        INSTANCE = new SimpleInstance();
        return INSTANCE;
    }

    @Override
    public void doSomething(){
        Log.i("tag00","      ");
    }
}
餓漢単例モード、スレッド安全
package com.example.administrator.singleinstance;

import android.util.Log;

/**
 * Created by Administrator on 2016/12/26.
 */

public class HungryInstance extends Instance{
    private static HungryInstance instance;
    public HungryInstance(){}

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

    @Override
    public void doSomething(){
        Log.i("tag00","      ");
    }
}

DLC単例モードは,餓漢に基づいて二次判定と同期ロックを加えた.スレッドのセキュリティ
package com.example.administrator.singleinstance;

import android.util.Log;

/**
 * Created by Administrator on 2016/12/26.
 */

public class DLCInstance extends Instance{
    //   volatile             
    private static volatile DLCInstance instance;
    public DLCInstance(){}
    public static DLCInstance getInstance(){
        if (instance == null){
            synchronized (DLCInstance.class){
                if (instance == null){
                    instance = new DLCInstance();
                }
            }
        }
        return instance;
    }
    @Override
    public void doSomething(){
        Log.i("tag00","DLC    ");
    }
}
内部クラス単例モード、静的内部クラスを使用して単例を作成
package com.example.administrator.singleinstance;

import android.util.Log;

/**
 * Created by Administrator on 2016/12/26.
 */

public class InnerInstance extends Instance{

    public InnerInstance() {
    }

    private static class InnerClass{
        public static InnerInstance instance =  new InnerInstance();
    }

    public static InnerInstance getInstance(){
        synchronized (InnerInstance.class){
            return InnerClass.instance;
        }
    }

    @Override
    public void doSomething(){
        Log.i("tag00","       ");
    }
}
列挙クラス単例モードでは、多くの人が静的内部クラスと列挙クラス単例を推奨している.理由はもちろんスレッドとリソースのロード性能の面で、高い同時性が現れたときや異なるスレッドが同時性が現れたときにしか現れず、一般的に小さなプロジェクトでは見えません.
package com.example.administrator.singleinstance;

import android.util.Log;

/**
 * Created by Administrator on 2016/12/27.
 */

public enum  EnumInstance {
    INSTANCE;
    public void doSomething(){
        Log.i("tag00","      ");
    }
}
ここで、私のすべてのインスタンスは抽象的な親クラスを継承し、すべてのインスタンスクラスを統一的に管理することができます.統合機能が必要な場合は、親に追加するだけです.あるいは個別のインターフェースを加えればいいです.単一例を管理するためにMapを書きます.
package com.example.administrator.singleinstance;

/**
 * Created by Administrator on 2016/12/27.
 */

public abstract class Instance {
   abstract void doSomething();
}
package com.example.administrator.singleinstance;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by Administrator on 2016/12/27.
 */

public class InstanceManager {
    private static Map<String,Object>instanceMap = new HashMap<>();

    public static void init(){
        instanceMap.put(SimpleInstance.class.getName(),SimpleInstance.getInstance());
        instanceMap.put(DLCInstance.class.getName(),DLCInstance.getInstance());
        instanceMap.put(EnumInstance.class.getName(),EnumInstance.INSTANCE);
        instanceMap.put(HungryInstance.class.getName(),HungryInstance.getInstance());
        instanceMap.put(InnerInstance.class.getName(),InnerInstance.getInstance());
    }

    public static Instance getInstance(String InstanceName){
        return (Instance) instanceMap.get(InstanceName);
    }

    public static EnumInstance getEnumInstance(String InstanceName){
        return (EnumInstance) instanceMap.get(InstanceName);
    }


}
InstanceManagerでは一例クラス名をKeyとし、オブジェクトObjectをValueとする.取るときは単例クラス名で取れるので、この例では少し余計かもしれませんが、プロジェクトが大きくなると単例クラスが多くなるので管理しやすいです.
基本的な単例モードはこれだけで、具体的には使用時にどんな問題が発生したか、具体的な問題が具体的に処理されているかを見ることです.では、ソースコードを取り始めます.Intentの単例を見てみましょう.
SDKのsourceフォルダの下でInputMethodManagerを検索します.このクラスはこのクラスがどのように単例を運用しているかを見てみましょう.
public final class InputMethodManager {
    static final boolean DEBUG = false;
    static final String TAG = "InputMethodManager";

    static final String PENDING_EVENT_COUNTER = "aq:imm";

    static InputMethodManager sInstance;
.......
}
まず静的インスタンスオブジェクトを作成し、真の論理は以下の通りです.
インスタンスがnullであるかどうかを判断し、nullの場合は新しいインスタンスを作成し、nullの場合は返さない.これが典型的な餓漢単例モデルの運用である.
AccessibilityManagerクラスを見てみると、この中にも単例モードが使われています.
単純な単例モード(怠け者)を使用し,直接インスタンス化する.簡単な暴力、いつワイヤロックをかけるべきか、いつどんなモードを使うべきかについては、ここでは詳しく説明しません.ブログを見つけて紹介します.最後に興味があれば、見てみましょう.これはjavaのJVMとメモリの割り当てから言います.単例モードを使用したソースコードがたくさんありますが、ソースコードに慣れていないので、ここまで書くしかありません.最後にそのブログのアドレスを添付します.http://www.iteye.com/topic/575052.よく書けましたね.
デザインモデルはAndroidアーキテクチャの運用において重要であり、重視してほしい.