設計パターン学習--前置きと単例モード


前言
前回のブログを書くのはもう半年近くになりました.忙しくて、怠けているか、今になってやっと更新します.前の半年に比べて技術がたくさん伸びました.進歩とは前に書いたコードを見て、馬鹿だと思います.この半年の間にもっと多くのものに接触しました.Androidはより多くの枠組みを学びました.また、台頭するkotlinも試しました.webはspringbootとspringcloudマイクロサービスの開発に入りました.プロジェクト全体をゼロから進歩が速いまで担当しています.そして、フロントの開発の進捗を速めるためにnodejsを勉強しました.ウェブサイトももうすぐオンラインします.サービスに対する感慨が多く、マイクロサービスに関する学習の心得を記録したいです.しかし、大牛の文章や経験の心得をたくさん見て、javaをより高い理解レベルに引き上げて、javaの20種類以上のデザインパターンを深く勉強したいです.jvmとコードをどうやって書くかはもっと優雅です.デザインの勉強は作者のzuoxiaolong 8810から来ました.彼の文章から多くのことを学びました.自分も簡単な総括をしたいですが、彼のように詳しくはできません.
シングルモード
1.一例モードとは?
単一の例モードとは、アプリケーションの中のクラスのうちの一つが、最初から最後までインスタンスだけを維持する状態である.このようなクラスの特徴は、いくつかのインスタンスに関係なく、彼らは同じであり、単一の例の状態を維持することで、メモリの消費を低減したり、予期せぬエラーの発生を回避したりすることができる.
2.単例モードの実現方法
例示的なクラスではどのように特徴を維持するかを避けるためには、まず、コンストラクタ法を用いてインスタンスを作成することができず、静的な方法を用いて単一の例の作成を制御することが考えられる.ここでは四つの単一例モードをまとめました.欠陥があるから完璧になります.
第一、一般単例モード
/**   
*               
* @Title: SingletonEasy.java 
* @Package singleton 
* @author       
* @date 2017-9-13   2:23:49 
*/
public class SingletonEasy {

    private static SingletonEasy singletonEasy;

    //                
    private SingletonEasy(){};

    public static SingletonEasy getInstance(){
        if(singletonEasy == null){//        ,   。          
            singletonEasy = new SingletonEasy();
        }
        return singletonEasy;
    }


}
これは第一例のパターンです.とても簡単です.まず、私有化コンストラクタが必要で、外部でコンストラクタによる実用化を防ぐ.静的方法getInstanceにおいて、インスタンスsingletonEasyが空の場合、新しいクラスのインスタンスを作成し、そうでなければ、クラスの繰り返しの作成を回避する.分かりやすいですが、欠陥は合併問題にあります.このクラスのインスタンスを外部から数千万の場所で同時に取得した場合、インスタンスが完全に作成されていない前に、別のコマンドもインスタンスが空であるためにif文に入った場合、新しいインスタンスが作成され、単一のインスタンス状態の失敗を招くことがある.この方法には合併の欠陥がある.
第二に、上の問題に対して少し改善された単一の例のパターンも解決する方法があります.すなわち、synchronizedに同期してコマンドを非同期に実行させないことです.欠点は消耗時間を増加させることです.したがって、コマンド毎に同期することはできません.インスタンスが空であると判断した時に同期し、後にインスタンスがあると確定したら同期する必要はありません.コードは以下の通りです
/**   
 *           
* @Title: SingletonEasy2.java 
* @Package singleton 
* @author       
* @date 2017-9-13   2:36:57 
*/
public class SingletonEasy2 {

    private static SingletonEasy2 singletonEasy2;

    //       
    private SingletonEasy2(){}

    //                   
    public static SingletonEasy2 getInstance(){
        if (singletonEasy2 == null) {
            synchronized (SingletonEasy2.class) {
                if (singletonEasy2 == null) {
                    singletonEasy2 = new SingletonEasy2();
                }
            }
        }
        return singletonEasy2;
    }
}
しかし、この方法は依然として欠陥が存在しており、上記の最初のものと類似している.jvmのレベルでは、クラスの例は原子的な動作ではなく、彼も三段階に分けられています.他のコマンドを実行していないのに、他のコマンドの作成を開始した場合があります.
第三に、最高の一例パターン上で述べたjvm作成例の三ステップは、それぞれ1.メモリ割り当て2.コンストラクタ初期化3.対象を割り当てられたメモリのアドレスに向けると、対象が最初に割り当てられたメモリを指すことを保証しない限り、一例の状態を保証することができます.ここでは第三の例のパターンを紹介します.
/**   
 *                       
* @Title: SingletonFinal.java 
* @Package singleton 
* @author       
* @date 2017-9-13   2:29:40 
*/
public class SingletonFinal {

    //                
    private SingletonFinal(){};


    private static SingletonFinal getInstance(){
        //                     ,         
        return SingletonCreate.singleton;
    }

    //          
    private static class SingletonCreate{
         static SingletonFinal singleton = new SingletonFinal();
    }
}
クラスで初期化のクラス例として静的変数を含む内部クラスSingleton Createを作成した.外部get Instance方法は、直接に内部クラスで初期化されたインスタンスを取得すれば良い.この方法は単一の例の状態を維持できる理由は、クラスの静的属性が初めてクラスをローディングした時に初期化されるだけであり、また静的変数は一度だけ初期化されるので、シングルトンはまだ一例であるため、繰り返し作成の問題を心配する必要はない.これが一番いいモデルです.
第四に、怠け者の一例モードの怠け者の一例のパターンは第三の考え方と似ています.
/**   
 *       ,     ,         
* @Title: SingletonLazy.java 
* @Package singleton 
* @author       
* @date 2017-9-13   2:32:55 
*/
public class SingletonLazy {

    //            ,        
    private static SingletonLazy singleton = new SingletonLazy();

    //                
    private SingletonLazy(){};

    private static SingletonLazy getInstance(){
        return singleton;
    }

}
内部クラスを使用せずに直接的に静的な例を作成することが見られます.この方法は日常的に使用されても大丈夫です.欠点はメモリの無駄遣いです.このような種類は他の静的領域が存在する可能性があります.他の静的リソースを使用する場合、サブクラスのインスタンスが必要でない場合も、このようなインスタンスを作成し、リソースの無駄をもたらします.第三の方法では、get Instance方法を使用して、内部クラスにアクセスし、インスタンスを作成する.
これはいくつかの一般的なパターンをまとめたもので、学習の記事ではvolatile関連の方法を紹介しています.ここでは紹介しません.次の記事の内容はプロキシモードであるべきです.エージェントモードでよく見られる表現は、切断面向けの開発、つまりAOPです.勉強した文章の中でデータベース接続池の例を使っています.他のいい例を考えて、更新の進捗を維持してください.
次のプロキシモード