設計モード――(単例モード)


  • 単例モード概要:単例モード(Singleton Pattern)はJavaの中で最も簡単な設計モードの一つである.このタイプの設計モードは、オブジェクトを作成するための最適な方法を提供する作成モードに属します.このモードは、独自のオブジェクトを作成し、単一のオブジェクトのみが作成されることを保証する単一のクラスに関連します.このクラスは、クラスのオブジェクトをインスタンス化する必要がなく、直接アクセスできる独自のオブジェクトにアクセスする方法を提供します.注:1、単一のインスタンスクラスには1つのインスタンスしかありません.2、単一のインスタンスクラスは、独自の一意のインスタンスを作成する必要があります.3、単一のクラスは、他のすべてのオブジェクトにこのインスタンスを提供する必要があります.コア:目的:クラスにインスタンスが1つしかないことを保証し、グローバル・アクセス・ポイントを提供します.主な解決:グローバルに使用されるクラスが頻繁に作成され、破棄されます.≪いつ使用|Use|emdw≫:インスタンスの数を制御し、システム・リソースを節約したい場合.どのように解決するか:システムにこの単例があるかどうかを判断し、ある場合は戻り、ない場合は作成します.キーコード:コンストラクション関数はプライベートです.応用例:1、1つの王朝には1人の皇帝しかいない.2、Windowsはマルチプロセスマルチスレッドであり、1つのファイルを操作する場合、複数のプロセスまたはスレッドが同時に1つのファイルを操作する現象は避けられないため、すべてのファイルの処理は唯一のインスタンスで行わなければならない.3、一部のデバイスマネージャは、1つのコンピュータに2台のプリンタがあり、出力時に2台のプリンタで同じファイルを印刷できないように処理するなど、単一のモードとして設計されることが多い.利点:1、メモリにインスタンスが1つしかないため、メモリのオーバーヘッドが削減され、特に頻繁にインスタンスの作成と破棄(管理学院のトップページページキャッシュなど)が行われます.2、資源の多重占有(例えばファイルを書く操作)を避ける.欠点:インタフェースがなくて、継承することができなくて、単一の職責の原則と衝突して、1つのクラスは内部の論理だけに関心を持つべきで、外がどのように実例化することに関心を持たない.使用シーン:1、一意のシリアル番号を生産する必要があります.2、WEBのカウンターは、リフレッシュするたびにデータベースに一度加算することなく、一例で先にキャッシュします.3、作成したオブジェクトは、I/Oとデータベースの接続など、消費するリソースが多すぎる.注意:getInstance()メソッドでは、同期ロックsynchronized(Singleton.class)を使用して、マルチスレッドが同時にinstanceが複数回インスタンス化されることを防止する必要があります.
  • 単例モード実現:
  • 餓漢モード:
    public class Singleton {  
    private static Singleton instance = new Singleton();  
    private Singleton (){}  
    public static Singleton getInstance() {  
    return instance;  
    }  
    }
    
    記述:この方式は比較的よく使われているが、ゴミ対象を生成しやすい.利点:ロックが付いていないと、実行効率が向上します.欠点:クラスがロードされると初期化され、メモリが浪費されます.
  • 怠け者モード:-スレッド不安全
    public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}   
    public static Singleton getInstance() {  
    if (instance == null) {  
    instance = new Singleton();  
    } 
    return instance;  
    }  
    }
    
    記述:この方式は最も基本的な実現方式であり、この実現の最大の問題はマルチスレッドをサポートしないことである.synchronizedはロックされていないため、厳密には単一のモードではありません.この方式lazy loadingは明らかで,スレッドの安全を要求せず,マルチスレッドでは正常に動作しない.コンカレントが発生すると、複数のインスタンスが作成されます.-スレッドセキュリティ
    public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  
    public static synchronized Singleton getInstance() {  
    if (instance == null) {  
    instance = new Singleton();  
    }  
    return instance;  
    }  
    }
    
    は、マルチスレッドで良好に動作するlazy loadingを備えているが、効率が低く、99%の場合同期を必要としないと説明している.利点:メモリの無駄を回避するために、最初の呼び出しで初期化されます.欠点:synchronizedをロックする必要がありますが、ロックは効率に影響します.
  • デュアルロック/デュアルロック
    public class Singleton {  
    private volatile static Singleton singleton;  
     private Singleton (){}  
     public static Singleton getSingleton() {  
     //             
     if (singleton == null) {  
    //      ,           ,     
     synchronized (Singleton.class) {  
     //                   。
     if (singleton == null) {  
     singleton = new Singleton();  
      }  
      }  
      }  
       return singleton;  
        }  
        }
    
    は、この方法はデュアルロックメカニズムを採用し、安全であり、マルチスレッドの場合に高性能を維持することができると説明している.経験談:一般的には、第2種と第3種の怠け者方式は推奨されず、第1種の餓漢方式が推奨されている.他に特別なニーズがある場合は、第4のデュアルロック方式を使用することが考えられる.