Java:設計モードの一例モード(Singleton)

2828 ワード

パターン名
Singleton
定義#テイギ#
クラスは、オブジェクトの参照(常に同じ)とインスタンスを取得する方法を返します.(通常getInstanceという名前を使用する静的メソッドでなければなりません).このメソッドを呼び出すと、クラスが保持する参照が空でない場合はこの参照を返し、クラスが保持する参照が空である場合はクラスのインスタンスを作成し、インスタンスの参照をクラスが保持する参照に付与します.また、クラスのコンストラクション関数をプライベートメソッドとして定義し、他の世代のコードは、クラスの構造関数を呼び出すことによってクラスのオブジェクトをインスタンス化することはできません.クラスが提供する静的メソッドによってのみ、クラスの唯一のインスタンスが得られます.
≪インスタンス|Instance|emdw≫
GPSクラスグローバルにはGPSが1つしかありません.GPSを呼び出すたびに、グローバル一意のGPSオブジェクトの参照を返すだけで、オブジェクトは再作成されません.
適用シーン
ハードウェアリソースなど、グローバルに1つのインスタンスしかない場合
構造階層
メリット
特定のインスタンスの要件に適応するために、リソースの一意性を保証するオブジェクトの作成のみを許可します.
制限
単一のモードは、マルチスレッドの適用の場合に注意して使用する必要があります.ユニークなインスタンスがまだ作成されていない場合、2つのスレッドが同時に作成メソッドを呼び出すと、ユニークなインスタンスの存在が検出されず、それぞれ1つのインスタンスが作成され、2つのインスタンスが構築され、単一のインスタンスモードでのインスタンスのユニークな原則に違反します.この問題を解決する方法は、クラスがインスタンス化されたかどうかを示す変数に反発ロックを提供することである(これは効率を低下させるが).
package com.freestudio.designpattern;

public class Singleton
{
  private static volatile Singleton singleton = null;//      
  
  private Singleton()
  {
	  //        
  }
  // >= JDK 1.5
  public static Singleton getInstance()
  {
	  if(singleton==null)
	  {
		  synchronized(Singleton.class)
		  {
			  if(singleton==null)
			  {
				  singleton = new Singleton();
			  }
		  }
	  }
	  return singleton;
  }
  public String toString()
  {
	  return "I'm Singleton and have only one instance.";
  }
}
package com.freestudio.designpattern;

public class Singleton
{
	private final static Singleton singleton = new Singleton();//      

	private Singleton()
	{
		//         
	}

	public static Singleton getInstance()
	{
		return singleton;
	}

	public String toString()
	{
		return "I'm Singleton and have only one instance.";
	}
}
テストコード:
	static void TestSingleTon()
	{
		Singleton singleton = Singleton.getInstance();
		System.out.println(singleton.toString());
	}

Androidの例:
Ringer.java (packages\apps\phone\src\com\android\phone)
public class Ringer {
//...
/** The singleton instance. */
    private static Ringer sInstance;
//...
  /* package */ static Ringer init(Context context) {
        synchronized (Ringer.class) {
            if (sInstance == null) {
                sInstance = new Ringer(context);
            } else {
                Log.wtf(LOG_TAG, "init() called multiple times!  sInstance = " + sInstance);
            }
            return sInstance;
        }
    }

    /** Private constructor; @see init() */
    private Ringer(Context context) {
        mContext = context;
        mPowerManager = IPowerManager.Stub.asInterface(ServiceManager.getService(Context.POWER_SERVICE));
    }
}

Androidソースコードでsingletonを検索するとSingletonのインスタンスがたくさん見つかります.
参照:単一モード