設計モードの単例モード:怠け者&餓漢

6338 ワード

怠け者式と餓漢式
いわゆる「怠け者式」と「餓漢式」の違いは,単例対象の作成時期との違いである.「怠け者式」は、あなたが本当に使っているときにこの単例オブジェクトを構築します.例えば、単例オブジェクトがあります.
public class Singleton{ 
    private Singleton(){}
    private static Singleton singleton = null//     
    public static synchronized Singleton getInstance(){
             if(singleton == null) {        //                       
                 singleton = new Singleton ();  //      
             }
             return singleton ;
     }
}

「餓漢式」は、あなたが使えなくても、最初からこの単例オブジェクトを構築します.例えば、単例オブジェクトがあります.
public class Singleton{ 
    private Singleton(){}
    private static Singleton singleton = new Singleton();  //    
    public static Singleton getInstance(){
        return singleton ;//            }}

次の要素があります.
  • 私有の構造方法
  • は、自分のインスタンスを指すプライベート静的参照
  • を指す.
  • 自己のインスタンスを戻り値とする静的公有の方法
  • 単一モード
    単例モードは、実は1つのクラスに対して、1つのオブジェクトしか新規作成できず、複数の重複したオブジェクトは作成できません.これにより、ログのロードなど、プログラムが実行されるときに一意のオブジェクトが見つかり、正しく一致するようになります.一山に二虎がいてはいけないようなものだ.主な考え方はstaticを用いて,クラス内部でnewが自分のオブジェクトを1つ,クラスメソッドでこのオブジェクトに戻ることである.静的メソッドnewから出るオブジェクトであるため,実際には同じhashCode,すなわち同じオブジェクトがある.コードは次のとおりです:Test.java
    package com.demo_type;
    
    public class Test {
        public static void main(String[] args){
    
            //    
            Singleton s1 = Singleton.getInstance();
            Singleton s2 = Singleton.getInstance();
    
            if(s1 == s2){
                System.out.println("s1 = s2");
            }
            else{
                System.out.println("s1 != s2");
            }
            //    
            Singleton2 s3 = Singleton2.getInstance();
            Singleton2 s4 = Singleton2.getInstance();
            if(s3 == s4){
                System.out.println("s3 and s4 is the same");
            }
            else{
                System.out.println("s3 and s4 is NOT the same");
            }
    
        }
    }

    2.Singleton.java
    package com.demo_type;
    
    /**
     *     Singleton
     *     :             ,   
     *   :                    
     */
    public class Singleton {
        //1.        ,           
        private Singleton(){
    
        }
        //2.            
        //3.    static(      private,     )
        private static Singleton instance = new Singleton();
    
        public static Singleton getInstance(){
            return instance;
        }
    }

    3.Singleton2.java
    package com.demo_type; 
    /**
     *     
     *   :                ,       -    
     *                      ,       -     
     */
    public class Singleton2 {
        //1.        ,           
        private Singleton2(){
    
        }
        //2.        ,  private static   
        private static Singleton2 instance;
    
        //3.    ,       
        public static Singleton2 getInstance(){
    //      if(instance == null){
    //          return new Singleton2();
    //      }
    //      else{
    //          return instance;
    //      }
            if(instance == null){
                instance = new Singleton2();
            }
                return instance;
        }
    }

    怠け者モードと餓漢モードの名前も分かりやすいです.餓漢モードはクラスロード時にすでにnewがオブジェクトを出しているので、このモードのnewオブジェクトは焦っていますが、怠け者は必要なときにnewして、ゆっくりしません.