シングルトンモデルインタビュー、それが被験者の具体例を生成する、オブジェクト作成モードで、最も一般的なデザインパターンの中で、システムは、クラスのインスタンスが1つだけ生成されることを保証することができます。
要するに、Singletonパターンは2つの利点をもたらすことができます。
1は、オブジェクトを頻繁に使用するために、オブジェクトが繰り返し作成に費やす時間を節約することができます。
図2に示すように、操作対象のインスタンスを低減するため、したがって、システムメモリの使用頻度を減らすことができます。
上記二点によれば、効果的にシステムのパフォーマンスを向上させることができ、単一の実施の形態を使用して見ることができます。
最も一般的なシングルトンパターン飢えた男と怠惰なモードがあります。
1、長い間飢えモード:
1つの パブリック クラスシングルトン{ 2 3 プライベートシングルトン(){} 4 5 プライベート 静的 最終シングルトンインスタンス= 新しいシングルトン()。 6 7 パブリック 静的シングルトンのgetInstance(){ 8 9 戻りインスタンス。 10 } 11 }
インスタンスは、静的メンバ定義された変数なので、JVMのシングルトンをロードするときに、単一の場合、シングルトンオブジェクトは、作成されているので、このシングルトンパターンは非常に単純で、唯一の欠点は、インスタンスインスタンスのロードに遅らせることはありません。システムのような場合も、他の静的メソッドを呼び出すには、このシングルトンクラスによって毎回他の静的メソッドが含まれている場合、静的メンバ変数がロードされ定義された、プライベート静的最終シングルトンインスタンス=新しいシングルトンがロードされます()、したがって、それはシングルトンインスタンスを作成し、実施例を介して説明することができます。
1 パブリック クラスシングルトン{ 2 3。 プライベートシングルトン(){ 4。 5。 のSystem.out.println( "単一の実施形態を作成する!" ); 6 } 。7 8。 プライベート 静的 最終シングルトンインスタンス= 新しい新しいシングルトン(); 9 10 パブリック 静的シングルトンgetInstance(){ 11 12は、 リターン例えば、 13である } 14 15 公共 静的 ボイド試験(){ 16 。17 "!このメソッド呼び出し"のSystem.out.println(); 18 } 19 20 }
この情報をプリントアウトします:
したがって、コール関連機能の時のシステムの応答速度に影響を与えるであろう、何の遅延ローディング機構がないため、問題のオブジェクトの存在を簡単に作成することができるモードを飢えすることはこの問題を解決するためのローディング機構を遅らせるために追加することができます。
プラス遅延機構のシングルトンパターンは、それが私たちの共通の怠惰なモードが、このリガ同期セキュリティメカニズム次のようになります。
1 パブリック クラスSingletonSyn { 2 3。 プライベートSingletonSyn(){ 4 のSystem.out.println( "レイジースレッドセーフシングルトンを作成する!" ); 5 } 6。 7。 プライベート 静的 SingletonSynインスタンス= NULL ; 8 9。 パブリック 静的 同期SingletonSyn getInstance(){ 10 IF(例えば== NULL ) 11。 インスタンス= 新しい新しいSingletonSyn(); 12は、 リターン例えば、 13である 14 } 15 }
ことに留意すべき場所:ときにスレッド1 N新しい単一の実施形態のgetInstance()メソッドは、操作の割り当てを完了するために、同期、またはマルチスレッド環境でなければならない、スレッド2は、インスタンスがnullに決定することができる、スレッド2となるように複数のインスタンスにつながる新しいシングルトンプログラムは、作成された開始、パフォーマンスへの影響が大きくなりますので、addが同期同期を実行する必要があります。
追加同期キーワードが、それは、また、シャオシャオ敗者のように記述することができる同期は同期の問題を解決することができますが、マルチスレッド環境では、その性能は最初の空腹の男モードを消費するよりもはるかに大きくなります。
上記実施形態2のシングルモードに基づいて、改善を促進することができます。
1つの パブリック クラスシングルトン{ 2 3。 プライベートシングルトン(){System.out.printlnは(「内部クラスに基づいて、シングルトンパターンを作成する!」); } 。4 。5 プライベート 静的 クラスSingletonHolderを{ 6 プライベート 静的 Singeltonインスタンス= 新しい新しいシングルトン( ); 7 。8 } 。9 10 パブリック 静的 シングルトンのgetInstance(){ 11。 12が 戻りSingletonHolder.instance、 13は 14 } 15 }
上記内部クラスインスタンスの例は、単一の実施形態を維持するために、シングルトンが初期化されないクラス内ロードされるとき、のgetInstance場合にのみ、クラスがJVMシングルトンにロードされる場合、シングルトンクラスが初期化されていないことを確認することが可能です()が呼び出されると、クラスがそれによってシングルトンインスタンスをインスタンス化し、SingletonHolder内部にロードされます。一方、インスタンスの確立が行われるので、クラスがロードされた場合にのみ、それは同期を使用せず、本質的にマルチスレッド友情、getInstanceメソッドで同期、可視、シングルトンを達成するための内部クラスの方法を使用して、遅延ロードの両方を行うことができ、使用しませんsynchronizedキーワードは、より完全な実現です。
もちろん、シングルトンは、より完全な設計のために、より良い方法がありますが、興味のあるパートナーは徹底的な議論を行うために続けることができます。