Singletonモデルは、23の設計モデルの中で最もシンプルな設計モデルであり、エンタープライズ開発でも広く使用されています。シングルトンパターンの利点は、プロジェクトに1つのインスタンスしかないことです。
機能:コンストラクターは民営化され、オブジェクトは民営化され、外部アクセスインターフェイスのみを提供します。
アプリケーションシナリオ:
1.システムはリソースを共有する必要があります:ログシステム、スプリングリソースマネージャーなど。
2。リソースの使用を制御するため:スレッドプールなど
エンタープライズレベルの開発と一般的なフレームワークにおける一般的なアプリケーション:
J2EEのサーブレット、春のリソースマネージャー(つまり豆)、データベース接続プール、スレッドプール、ログシステム、ウェブサイトカウンターなど。
シングルトンパターン分類:
1。ハングリーモード:Hungry Modeはコードで最もシンプルなSingletonモードですが、インスタンスはクラスが初期化されたときにロードされます。即座に使用されない場合、システムはロードされます。特定のコードは次のとおりです。
パブリッククラスシングルトン{private static singleton instance = new Singleton(); private singleton(){} public static singleton getInstance(){return instance; }}2。レイジーモード:空腹モードと比較して、レイジーモードはインスタンス化され、プロセスの外部インターフェイスのみに配置されます。これにより、荷重が遅れ、システムの初期化時間を節約できますが、スレッドが安全でない状況があります。
パブリッククラスシングルトン{プライベート静的シングルトンインスタンス= null; private singleton(){} public static singleton getInstance(){if(instance == null){return new Singleton(); } returnインスタンス; }}3.ダブルチェックロック:ダブルチェックロックモードは、実際にはレイジーモードのアップグレードであり、レイジーモードのスレッドセーフになります。注:ダブルチェックロックにはメモリの問題があり、ダブルチェックロックを無効にする可能性があります。
パブリッククラスシングルトン{プライベート静的シングルトンインスタンス= null; private singleton(){} public static singleton getInstance(){if(instance == null){synchronized(singleton.class){if(instance == null){return new Singleton(); }} return instance; }}4。静的内部クラスモード:静的内部クラスには、怠zyなモードと邪悪なモードの両方があります:スレッドセーフ、遅延荷重。
パブリッククラスSingleton {private Static Class SingletonFactory {private static Singleton instance = new Singleton(); } private singleton(){} public static singleton getInstance(){return singletonfactory.instance; }}5。列挙クラスモード:これは、スレッドセーフであるだけでなく、略奪や反射の問題を防ぐ最も完璧なシングルインテストモードである必要があります。
Enum Singleton {instance; public void dosomething(){...}}シングルトンパターンの詳細の問題:
1.反射がシングルトンモードを破壊する:リフレクションはシングルトンモードの実装を破壊する可能性があります(列挙モードを除く)
/***反射によるシングルトンモードを破壊*/public class demo01 {public static void main(string [] args)throws exception {singleton s1 = singleton.getInstance(); Singleton S2 = Singleton.getInstance(); System.out.println(s1 == s2); class <singleton> clazz =(class <singleton>)class.forname( "com.singleton.singleton"); Constructor <singleton> constructor = clazz.getDeclaredConstructor(null); constructor.setAccessible(true); Singleton S3 = constructor.newinstance(); System.out.println(s1 == s3); }} class singleton {private static singleton instance = new Singleton(); private singleton(){//反射が単一利益モードを破壊するのを防ぐ方法、コメントセクションを開きます。 }}実際、いわゆる予防は、反省を通して創造することを不可能にすることを意味します。
2。脱介入はシングルトンパターンを破壊します(列挙クラスパターンを除く)
/*** DaserializationはSingleton Patternを破壊します*/public class demo02 {public static void main(string [] args)throws exception {singleton s1 = singleton.getInstance(); Singleton S2 = Singleton.getInstance(); System.out.println(s1 == s2); fileoutputStream fos = new fileoutputStream( "d://test.txt"); ObjectOutputStream OOS = new objectOutputStream(FOS); oos.writeobject(s1); oos.close(); fos.close(); ObjectInputStream ois = new ObjectInputStream(new FileInputStream( "d://test.txt")); Singleton S3 =(Singleton)Ois.ReadObject(); System.out.println(s1 == s3); }} class SingletonはSerializable {private static Singleton instance = new Singleton(); public static singleton getInstance(){return instance; } //デフォルトの脱介入、オブジェクトが既に存在する場合、この方法は// private object readResolve()を呼び出しますobjectStreamException {// return instance; // //}}これらの2つの状況は理解に限定されており、実際の開発プロセスではあまり使用されていません。
この時点で、シングルトンパターンが完成しました。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。