シングルトンパターンの概念:
JavaのSingletonパターンは、一般的なデザインパターンです。シングルトンパターンは、レイジーシングルトン、ハングリーシングルトン、登録されたシングルトンの3つのタイプに分かれています。
Singletonモードには次の特性があります。
1.シングルトンクラスには1つのインスタンスしかありません。
2。シングルトンクラスは、独自のユニークなインスタンスを作成する必要があります。
3. Singletonクラスは、他のすべてのオブジェクトにこのインスタンスを提供する必要があります。
Singleton Patternは、クラスに1つのインスタンスしかないことを保証し、それ自体をインスタンス化し、このインスタンスをシステム全体に提供します。コンピューターシステムでは、スレッドプール、キャッシュ、ログオブジェクト、ダイアログボックス、プリンター、グラフィックカード用のドライバーオブジェクトは、多くの場合、シングルトンとして設計されています。これらのアプリケーションには、多かれ少なかれリソースマネージャーの機能があります。各コンピューターには複数のプリンターを使用できますが、プリンタースプーラーが1つだけ使用できるのは、2つの印刷ジョブが同時に出力されないようにすることができます。各コンピューターにはいくつかの通信ポートがあり、システムはこれらの通信ポートを中央に管理して、1つの通信ポートが2つのリクエストによって同時に呼び出されないようにする必要があります。要するに、シングルトンモデルを選択することは、一貫性のない状態を避け、政治的な強気を避けることです。
まず、古典的なシングルトンの実装を見てみましょう。
パブリッククラスシングルトン{private static singleton inlecting intance = null; private singleton(){//インスタンスを倒すためだけに存在します。 } public static singleton getInstance(){if(siquientInstance == null){anquibleInstance = new Singleton(); } uniqueInstanceを返します。 } //その他の方法...}シングルトンは、コンストラクターをプライベートに制限することにより、クラスが外部からインスタンス化されることを避けます。同じ仮想マシンの範囲では、Singletonの唯一のインスタンスは、getInstance()メソッドからのみアクセスできます。 (実際、Java反射メカニズムを通じて、プライベートコンストラクトを使用してクラスをインスタンス化することができます。これは、基本的にすべてのJava Singletonの実装を無効にします。この問題はここでは説明されません。反射メカニズムは存在しないと思います。)
ただし、上記の実装では、スレッドの安全性の問題を考慮していません。スレッドの安全性とは、コードが複数のスレッドが同時に実行されているプロセスで、これらのスレッドが同時にこのコードを実行できる場合。各実行の結果が単一のスレッド実行の結果と同じであり、他の変数の値が予想と同じである場合、それはスレッドセーフです。言い換えれば、クラスまたはプログラムによって提供されるインターフェイスは、スレッドの原子動作であるか、複数のスレッド間の切り替えはインターフェイスの実行結果にあいまいさを引き起こすことはありません。つまり、同期の問題を考慮する必要はありません。明らかに、上記の実装はスレッドの安全要件を満たしておらず、複数のSingletonインスタンスが同時環境に表示される可能性があります。
public class testStream {private string name; public string getName(){return name; } public void setName(string name){this.name = name; } //このクラスには1つのインスタンスのみを持つことができますprivate testStream(){} //プライベート非アーグメントコンストラクター//このクラスは、2つの方法があります// 2つの方法があります/*private static final testStream ts = new testStream();*/private static testStream ts1 = null; //このクラスは、このインスタンスオブジェクトをシステム全体に自動的に提供する必要がありますpublic static testStream getTest(){if(ts1 == null){ts1 = new testStream(); } ts1を返します。 } public void getInfo(){system.out.println( "output message"+name); }} public class testmain {public static void main(string [] args){testStream s = testStream.getTest(); S.SetName( "Zhang Xiaoxiang"); system.out.println(s.getname()); testStream S1 = testStream.getTest(); S1.setName( "Zhang Xiaoxiang"); system.out.println(s1.getname()); s.getinfo(); s1.getinfo(); if(s == s1){system.out.println( "同じインスタンスが作成された"); } else if(s!= s1){system.out.println( "は同じインスタンスではない"); } else {system.out.println( "アプリケーションエラー"); }}}}実行結果:
Zhang Xiaoxiang Zhang Xiaoxiang
出力メッセージZhang Xiaoxiang
出力メッセージZhang Xiaoxiangは同じインスタンスを作成しました
結論:結果から、シングルトンパターンは、オブジェクトの一意のアクセスポイントを備えたオブジェクト指向のアプリケーションを提供することがわかります。どんな機能が実装されていても、アプリケーション全体がインスタンスオブジェクトを共有します。
1。空腹のシングルトン
//空腹のシングルトンクラス。クラスの初期化の場合、パブリッククラスのSingleton1はそれ自体にインスタンス化されています{//プライベートデフォルトコンストラクターPrivate Singleton1(){} //プライベート静的最終Singleton1 single = new Singleton1(); // static Factoryメソッドpublic static singleton1 getInstance(){return single; }} 2。怠zyなシングルトンクラス
// Laggy Singletonクラス。 Instantiate Public Class Singleton2は、初めてのパブリッククラスSingleton2と呼ばれたとき{// private default constructor private singleton2(){} //最終的なprivate static singleton2 single = nullはないことに注意してください。 // static Factory Method public synchronized static singleton2 getInstance(){if(single == null){single = new singleton2(); } return single; }} 3。登録されたシングルトンクラス
java.util.hashmapをインポートします。 java.util.mapをインポートします。 //登録されたシングルトンクラス。 //春のメソッドと同様に、クラス名を登録し、次回から直接入手してください。パブリッククラスSingleton3 {private static Map <String、Singleton3> Map = new Hashmap <String、Singleton3>(); static {singleton3 single = new Singleton3(); map.put(single.getClass()。getName()、single); } //保護されたデフォルトコンストラクター保護されたSingleton3(){} //静的ファクトリーメソッド、このクラスの一意のインスタンスを返しますpublic static singleton3 getInstance(string name){if(name == null){name = singleton3.class.getname(); System.out.println( "name == null"+"---> name ="+name); } if(map.get(name)== null){try {map.put(name、(singleton3)class.forname(name).newinstance()); } catch(instantiationexception e){e.printstacktrace(); } catch(Illegalaccessexception e){e.printstacktrace(); } catch(classNotFoundException e){e.printstacktrace(); }} return map.get(name); } //概略的な商業方法public string arbout(){return "hello、i are regsingleton。"; } public static void main(string [] args){singleton3 single3 = singleton3.getinstance(null); system.out.println(single3.about()); }}上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。