シングルトン(シングルトン):JAVAは、作成したスキーマに属する、最もシンプルなデザインパターンです。いわゆる単一の実施形態、及びプログラム全体がインスタンスを1つだけ有します。
特長:
コンストラクタの民営化
このクラスでは、本のようにオブジェクトのクラス属性をインスタンス化します
この方法でクラスオブジェクトへの外部アクセスを提供します
飢えタイプ:オブジェクトのクラスローダをロードします
シナリオ:小さなオブジェクト、頻繁に、同時実行性の高いです
特長:より一般的に、スレッドセーフな、しかし無駄になりやすい、パフォーマンスに影響を与える、スタートの初期化ので。
1 クラスシングルトン{ 2 // コンストラクタ民営化 3。 プライベートシングルトン(){ 4 のSystem.out.println(「コンストラクタ」); 5 } 6 // クラスがロードされるときにオブジェクトが初期化される 。7 プライベート 静的 最終 シングルトンインスタンス= 新しい新しいシングルトン(); 8 // 外部アクセス方法提供する 。9 パブリック 静的シングルトンのgetInstance(){ 10 リターンインスタンス; 11 } 12です }
レイジースタイル:必要なときにオブジェクトが作成され、スレッドセーフ
シナリオ:シングルスレッド、ラージオブジェクト
特長:危険な遅延初期化を通します。
1 クラスシングルトン{ 2 プライベートシングルトン(){ 3 のSystem.out.println( "构造方法" )。 4 } 5 プライベート 静的シングルトンインスタンス。 6 パブリック 静的 シングルトンのgetInstance(){ 7 であれば(例えば== NULL ){ 8 インスタンス= 新しいシングルトン()。 9 } 10 リターンインスタンス。 11 } 12 }
同期ロック機構
シナリオ:マルチスレッド、大きなオブジェクト、まれに使用。
特長:スレッドの安全性を確保するためにロックすることによって、パフォーマンスが低下します。
1 クラスシングルトン{ 2 プライベートシングルトン(){ 3 のSystem.out.println(「コンストラクタ」); 4 } 5。 プライベート 静的シングルトンインスタンス; 6 // 同期方法は、スレッドセーフが、パフォーマンスが低下するであろう 。7 パブリック 静的 同期シングルトンのgetInstance (){ 8。 IF(例えば== NULL ){ 9。 インスタンス= 新しい新しいシングルトン(); 10 } 11 リターンインスタンス; 12である } 13です }
二要素認証
シナリオ:ラージオブジェクト、まれで、量によって複雑には大きすぎではありません
特長:スレッドセーフ、遅延初期化。
1 クラスシングルトン{ 2 プライベートシングルトン(){ 3 のSystem.out.println(「コンストラクタ」); 4 } 5。 プライベート 静的 揮発性のシングルトンインスタンス; 6 // 同期方法、二要素認証、性能を改善するために、ブロックの数を減らす 。7 パブリック スタティックgetInstanceシングルトン(){ 8 IF(例えば== NULL ){ 9 同期(シングルトン。クラス){ 10 IF(例えば== NULL ){ 11 インスタンス= 新しい新シングルトン(); 12 } 13 } 14 } 15 リターンインスタンス。 16 } 17 }
静的な内部クラス
リファレンスシナリオ:大規模なオブジェクト、頻繁に、同時実行性の高いです
特長:遅延オブジェクトの作成、リソースの消費量を削減、システムのパフォーマンスを向上させます
1 クラスシングルトン{ 2 プライベートシングルトン(){ 3 のSystem.out.println( "构造方法" )。 4 } 5つの 静的 クラスインナー{ 6 プライベート 静的 最終 シングルトンインスタンス= 新しいシングルトン()。 7 } 8 パブリック 静的シングルトンのgetInstance(){ 9 リターンInner.instance。 10 } 11 }
数え上げます
1つの 列挙シングルトン{ 2 // クラスローダ作成 3。 INSTANCE; 4 }
Singletonパターンは、スキーマを作成することですので、それぞれの呼び出しは、新しいインスタンスを作成します。だから、重要な問題は、デシリアライズされます。インスタンスにデシリアライズするとき、インスタンスがファイルに書き込まれるとき、私たちはオーバーライドする必要があるreadResolve
インスタンスを一意にするための方法を。
1 プライベートオブジェクトはreadResolve()はスローObjectStreamException { 2 戻りシングルトンを、 3 }