設計モード(二)一一単例モード


コンセプト
シングル・インスタンス・モード(Singleton Pattern)はJavaで最も簡単な設計モードの1つです.この設計モードは作成型モードに属します.1つのクラスに1つのインスタンスしかないことを保証し、そのグローバル・アクセス・ポイントにアクセスします.よく使われるのは餓漢式と怠け者式の2種類です.
単一インスタンス・モードは、通常、クラス宣言に反映されます.単一インスタンスのクラスは、独自のオブジェクトを作成し、単一のオブジェクトのみが作成されることを保証します.このクラスは、クラスのオブジェクトをインスタンス化する必要がなく、直接アクセスできる独自のオブジェクトにアクセスする方法を提供します.
メリット
メモリにはインスタンスが1つしかなく、メモリのオーバーヘッドを削減し、リソースの多重占有を回避します.
インプリメンテーションモード
クラスのオブジェクトの生成はクラス構造関数によって行われます.クラスがpublicの構造方法を外部に提供する場合、外部は任意にクラスのオブジェクトを作成することができる.したがって、オブジェクトの生成を制限するには、構造関数をプライベート(少なくとも保護されている)に変更し、外部のクラスが参照によってオブジェクトを生成できないようにする方法があります.また、クラスの可用性を保証するためには、独自のオブジェクトと、そのオブジェクトにアクセスする静的メソッドを提供する必要があります.
餓漢式
餓漢、これは比較的イメージの生き生きとした比喩です.飢えた男にとって、彼はこの例を使いたいときにすぐに手に入れることができて、待つ時間が必要ないことを望んでいます.したがって、staticの静的初期化により、クラスが最初にロードされると、Singletonのインスタンスが作成される.このようにして、初めてこのオブジェクトを使用しようとしたとき、彼は初期化されました.
//code1
public class Singleton {
    //           
    private static Singleton instance = new Singleton();

    //       ,      
    private Singleton(){
    }

    //             
    public static Singleton getInstance(){
        return instance;
    }
}

コードテスト:
//code2
public class SingletonTest {
    public static void main(String[] args) {
        Singleton singleton1 = Singleton.getInstance();
        Singleton singleton2 = Singleton.getInstance();
        System.out.println(singleton1==singleton2);

    }
}

出力結果
true

怠け者風
怠け者、少し怠け者、早めにインスタンスを作成しないで、クラスが自分のインスタンス化に遅れて初めて引用されたとき.getInstanceメソッドの役割は、このオブジェクトが最初に使用されたときにnewに出てくることを望むことである.
//code3
public class Singleton2 {
    //    
    private static Singleton2 instance;
    
    //      
    private Singleton2(){
    }
    
    //             
    public static Singleton2 getInstance(){
        //             
        if(instance == null){
            instance = new Singleton2();
        }
        return instance;
    }
}

コードテスト:
//code4
public class SingletonTest {
    public static void main(String[] args) {
        Singleton2 singleton1 = Singleton2.getInstance();
        Singleton2 singleton2 = Singleton2.getInstance();
        System.out.println(singleton1==singleton2);

    }
}

出力結果:
true