1.はじめに
実際のビジネスでは、ほとんどのビジネスクラスは、1つのオブジェクトのみは、すべての作業を行うことができ、そしてそれはメモリ空間の無駄である他のオブジェクトを作成する必要があります。その後、我々はシングルトンパターンを使用し、それはその名前、このモデルが許す限りクラスは唯一のユニークなオブジェクトを生成することができます。シングルトンパターンは、異なるシングルトンを作成するには、このユニークな機会によると、怠惰なモードと飢えた男モードに分けることができます。
2.飢え(シングルトン)モード
HungrySingletonクラス{パブリック //オブジェクトの現在のクラスが存在することを確実にするために、可変現在のクラスは、静的メソッドへのアクセスを許可変数のクラスで宣言 プライベート静的LazySingleton singleInstance新しい新しいLazySingleton =()は、 プライベートString説明; //他の属性 / * *民営ユニークデフォルトコンストラクタは、外部(他のカテゴリ)によってインスタンスコンストラクタを作成できません * / } {)(プライベートLazySingletonを / ** *オブジェクトの一意のインスタンスを返し * @return * / / * *に起因しますコンストラクタ民営化され、直接オブジェクトのインスタンスを取得することはできません外部、あなたは参照オブジェクトの取得するためにインスタンスメソッドを呼び出すことはできません また、無限ループに陥っ*を(外部当初は、実用的なニーズを参照singleInstanceを保持し、このオブジェクトを渡したくありませんでした、それへの参照を取得するメソッドを呼び出して 追加の外部参照がそれを保持しなければならない場合、あなたはそれへの参照を取得するメソッドを呼び出す必要はありません*。) *オブジェクトのみに依存しない、と静的メソッドと静的メソッドとして、このメソッドを宣言することができます直接メンバ変数にアクセスすることはできません、singleInstanceは、静的クラス変数として宣言することができます * / 公共 たgetInstance静的LazySingleton(){ singleInstanceを返します。 } }
3.怠惰(シングルトン)モード
LazySingletonクラス{公共 //変化メモリの割り当て順序を防止するために、「揮発性」のキーワード声明、コンパイラの最適化を使用する プライベート揮発性の静的LazySingleton singleInstance =ヌル; //分類器がロック プライベートクラス決勝静的LazySingleton.class CLASS_LOCK =を<?>; //オブジェクトカウンタ プライベートinstanceCount静的INT = 0; プライベートLazySingletonは、(){ } / ** *クラスのオブジェクトが一意である返す * @return * / パブリック静的LazySingletonのgetInstance(){ / * 条件ことを確実にするためにマルチスレッドで、配置*シンクブロックを単一のオブジェクト(シングルスレッドでは同期が必要とされていない)があります * * singleInstanceインスタンス化、それはシンクブロックを提供されていることを検出するだけでなく。 それはsingleInstanceがインスタンス化された検出された場合*、プロセスは直接その参照を返します。 *この二重ロック同期検証、セットコードシンクブロックまたはメソッド宣言の同期方法よりも全体のプロセスは、パフォーマンスが非常に高いです。 *さらに2つのアイデアを同期させる必要がある一回のみのデュアル同期検証、同期、ので。 * * / IF(singleInstance == NULL){ 同期(CLASS_LOCK){ IF(singleInstance == NULL){ singleInstance =新しいLazySingleton()。 instanceCount ++; } } } singleInstanceを返します。 } }