2シングルトンデザインパターン

この問題を解決します

この問題を解決するためにSingletonパターンは次のとおりです。クラスはオブジェクトをインスタンス化できることを保証します。

実装

我々は、オブジェクトのクラスのインスタンスを1つだけ確保する場合、一般的に、プラクティスは、次のとおりです。


public class car{
    private Brake brake;
    public void useBreak(){
        if (brake == null)
            brake = new Brake();
        brake.run();
    }
}

ブレーキオブジェクトがない場合のみCarクラスは、このクラスが行う使用していますか?もっと登場していた車のブレーキのブレーキ、より多くの車のオブジェクトまたはオブジェクトのブレーキインスタンスの他のタイプがあることを保証するために、これだけやって(もちろんそうではない例ここでは、車は常にブレーキとなっています)。我々は他の誰かの権利のインスタンスを1つだけ保証できませんので、あなたは、そのオブジェクトのインスタンスのみを確実にするために、独自のクラスを作る必要があります。
いくつかのカテゴリの方法があります。

レイジー法

レイジーメソッドを使用すると、シングルトンインスタンスが必要になるまで、私は、オブジェクトがあなたに来るインスタンス化するために、行く待つことです。

public final class Singleton{
    private static Singleton singleton;
    
    private Singleton(){};
    
    public static Singleton getSingleton(){
        if (singleton == null)
            singleton = new Singleton();
        return singleton;
    }
}

空腹中国語、フランス語

空腹の男の法則は、あなたはそれが私を取得する必要があるときに、オブジェクトをインスタンス化を支援することです。飢え方法を実現するには、いくつかの方法があります。

この方法の下には最も簡単で、最もよく理解したが、マルチスレッドの場合、セキュリティ上のリスクがあります。

    
public final class Singleton{

    private static Singleton singleton = new Singleton();
    
    private Singleton(){};
    
    public static Singleton getSingleton(){
        return singleton;
    }
}

このメソッドは、次のクラスの初期化によってを利用します コード位置によって静的クラスのメンバ変数のシーケンスを実行するコードブロックの方法および原理の例。クラスのインスタンス化により、 第一に係る方法は、コンストラクタ内の位置コードとブロック符号例のメンバ変数が実行される行います。 この方法は、一度だけようにマルチスレッドセーフの場合には、(また、一度だけ、マルチスレッドの場合に実行されます)。


public final void Singleton{
    
    private static Singleton singleton;
    static{
        singleton = new Singleton();
    }
    private Singleton(){};
    
    public static Singleton getSingleton(){
        return singleton;
    }

}

この実施形態は、以下のenum(列挙)の方法に基づいており、それはシングルモードの実施形態を実現するための最良の方法です。マルチスレッドでは、ケースは、直列化中ですこの実装は安全です。


public enum Singleton{
    SINGLETON;
    //  接下来就是定义变量和方法(值得注意的是:变量和方法最好不是静态,不然SINGLETON无法使用,只能通过Singleton使用静态变量和方法)
}

ダブルチェックロッキング

マルチスレッド怠惰な方法の観点でロックダブル-確認しました。


public final class Singleton{
    
    private static Singleton singleton;
    
    private Singleton(){};
    
    private static Singleton getSingleton(){
        if (singleton == null){
            sychronized(Singleton.class){
                if (singleton == null)
                        singleton = new Singleton();
            }
            
        }
        return singleton;
    }
}

点数

  1. 施工方法は、単一のケースがプライベートであることを確実にするため、単一の新しい実施形態によってインスタンス化することができない(反射により、当然の又は複数のオブジェクトをインスタンス化することができます)

  2. シングルトンの保証は継承できません。

  3. インスタンスの例としては、本実施形態例の単一の例を得るために戻る前に、機能を確保します。

このようなメリットを実現します

  1. リソースへの同時アクセスを制御するために、スレッドの同期により、リソースの使用を制御

  2. リソースを節約するために、制御例の生成

  3. 複数のプロセスまたは無関係なスレッド間の通信に、直接確立に関連しない条件下で、制御データを共有

おすすめ

転載: www.cnblogs.com/zhangchenwei/p/12409950.html