単例モードの3種類の実現と区別


単例モードの3つの実現方法in Java
単一例モードは、GoF 23の設計モードの中で比較的一般的なものであり、あるクラスに1つのインスタンスしか存在させないことを主な目的としている.私は3つの単例モードのJava実装を列挙する.
メソッド1パラメータを持たない構造関数
本人が使用しているideaは、クラスを作成するときにSingletonのオプションがあり、このようにして生成されたクラスを選択すると、その書き方に属します.この書き方は比較的簡便で,欠点も比較的はっきりしている.
具体的なコードは以下の通りです.
public class Coraline {
   private static Coraline ourInstance = new Coraline();

   public static Coraline getInstance() {
      return ourInstance;
   }

   private Coraline() {
   }
}

メソッド2同期ロック付き単一例
この書き方はよく見られますが、主にsynchronizedキーワードに関連しています.具体的には次の編を参照してください.synchronizedキーワードのロックの粒度に注意してください.synchronizedがclassの前に追加されると、ロックされているのはクラス全体です.クラスに追加されたメソッドの場合、ロックされているのもクラス全体です.この書き方のコードは以下の通りです.
public class Coraline {
   private static Coraline ourInstance = new Coraline();
   private static Object lock = new Object();
   public static Coraline getInstance() {
      synchronized (lock){
         if(ourInstance == null){
            ourInstance = new Coraline();
            return ourInstance;
         }
         return ourInstance;
      }
   }

   private Coraline() {
   }
}

方法三重ロック
二重検査錠とは、その名の通り二重検査のことであるが、ここでの二重検査は、実は効率を向上させるためであり、ロックが必要な場合は、このクラスのインスタンスを作成する必要がある場合にのみ発生するため、ロックの粒度を低減することができ、作成しない場合には、ロックを行わずに効率を向上させることが推奨される書き方である.具体的なコードは以下の通りです.
public class Coraline {
   private static Coraline ourInstance = new Coraline();
   private static Object lock = new Object();
   public static Coraline getInstance() {
      if(ourInstance == null){
         synchronized (lock){
            if(ourInstance == null){
               ourInstance = new Coraline();
            }
         }
      }
      return ourInstance;
   }

   private Coraline() {
   }
}