定義:クラスに1つのインスタンスのみがあることを確認し、それをインスタンス化し、このインスタンスをシステム全体に提供します。
タイプ:クラスパターンクラス図を作成します:
クラス図の知識ポイント:
1。クラス図は、名前、属性、およびメソッドの3つの部分に分割されます。
2。<<で始まり、>>で終わるコメント情報
3。モディファイ +はパブリックを表し、 - プライベートを表し、#は保護されたものを表し、見えるパッケージを表すものはありません。
4.下線付きの属性またはメソッドは静的を表します。
5。クラス図のオブジェクト間の関係に慣れていない友人は、記事を参照できます。デザインパターンのクラス間の関係。
Singletonモードは、23の設計モードの中で最も簡単なモードである必要があります。次の要素があります。
簡単な例を見てみましょう。
パッケージcom.wolf.action; import java.util.hashmap; import java.util.map; public class demo {public static void main(string args [])throws instantiationexception、legalaccessexception、classnotfoundexception {system.out.out.println(son.getinstance()。 System.out.println( "WHO AM I"); }} class Sonは父親を拡張します{private string name = "son";最終文字列class = "demo"; protected string getname(){return this.query( "aaa"); } public static Son getInstance()Throws InstantiationException、Illegalaccessexception、ClassNotFoundException {//これはグローバルパスでなければなりません。 }} class father {private static map <string、object> instance = new hashmap <string、object>();プライベート文字列name = "Premium class"; protected void fatcher(){system.out.println( "私は親クラス"); }保護された文字列query(string sql){return sql + "ed ed"; } public staticオブジェクトインスタンス(String objname)InstantiationException、Illegalaccessexception、classNotFoundException {if(instance.get(objname)== null ||!(instance.get(objname)instance of父)){instance.put(objname、class.forname(objname); } return instance.get(objname); }}シングルトンパターンは、オブジェクトのインスタンス化のタイミングに従って2つのタイプに分割されます。1つは空腹のシングルトンで、もう1つは怠zyなシングルトンです。 Singletonクラスがロードされると、Singletonはオブジェクトを独自の参照にインスタンス化します。怠zyなスタイルは、インスタンスメソッドが呼び出されたときにのみオブジェクトをインスタンス化します。コードは次のとおりです。
空腹の男スタイルのシングルケース
パブリッククラスシングルトン{プライベート静的シングルトンシングルトン= new Singleton(); private singleton(){} public static singleton getInstance(){return singleton; }}怠zyなシングルケース
パブリッククラスシングルトン{プライベート静的シングルトンシングルトン; private singleton(){} public static同期Singleton getInstance(){if(singleton == null){singleton = new Singleton(); }シングルトンを返します。 }}シングルトンモードの利点:
適用可能なシナリオ:シングルトンモードの上記の利点により、プログラミングでより一般的に使用される設計モードです。 Singletonモードを使用するための適切なシナリオについて知っていることを要約しました。
シングルトンモードに関するメモ:
JavaのSingletonパターンについてのいくつかの論争:
Singletonモードのオブジェクトが長い間使用されていない場合、JVMガベージコレクターによって収集されますか?私は多くの情報を見ました:シングルトンオブジェクトが長い間メモリで使用されていない場合、それはJVMによるゴミと見なされ、ゴミコレクションを実行するときにクリーンアップされます。私はこの声明について懐疑的です。私自身の見解は次のとおりです。HotspotVirtual Machineバージョン1.6では、JVM Garbage Collectorは、Singletonのシングルトンオブジェクトを静的に参照していない限り、Singletonオブジェクトをリサイクルしません。
この論争に関して、著者はそれについて議論するために別の記事を書きました。異なる意見がある場合、またはこれを経験した場合は、記事Singleton Model Discussion:Singleton Model and Garbage Collectionがディスカッションに参加します。
JVMに複数のシングルトンが表示されますか
分散システム、複数のクラスローダー、およびシリアル化された複数のシングルトンが生成されますが、これは間違いなく真実です。それで、同じJVMでシングルトンが生成されますか?反射法が使用されない限り、シングルトンが提供するgetInstance()メソッドを使用して同じシングルトンのみを取得できます。新しいシングルトンが取得されます。コードは次のとおりです
class c = class.forname(singleton.class.getName()); Constructor CT = C.GetDecLaredConstructor(); ct.SetAccessible(true); Singleton Singleton =(Singleton)Ct.Newinstance();
このようにして、各実行は新しいシングルトンオブジェクトを生成します。したがって、Singletonモードを使用する場合は、リフレクションを使用して新しいSingletonオブジェクトを生成しないように注意してください。
怠zyなシングルトンスレッドは安全ですか?
主に、怠zyなシングルトンパターンがスレッドインセンスであるというのは、主にいくつかのオンラインステートメントです。同期されたキーワードをインスタンス化方法に追加することでさえ、依然として危険です。ただし、テストをエンコードした後、同期されたキーワードを追加して変更した後、パフォーマンスに部分的な影響を与えますが、スレッドセーフであり、複数のオブジェクトをインスタンス化しないことがわかりました。
シングルトンモードには、空腹と怠zyなスタイルの2種類しかありませんか?
Hungry SingletonとLazy Singletonは、比較的主流で一般的に使用されるシングルトンパターンの2つだけです。理論的には、クラスの1つのインスタンスのみを実装できるデザインパターンは、シングルトンパターンと呼ぶことができます。
シングルトンのクラスは継承できますか?
建設方法はプライベートであるため、継承可能ではありませんが、登録されたシングルトンなど、他の多くのシングルトンパターンを継承できます。
空腹のシングルトンであるか、怠zyなシングルトンになった方がいいですか
Javaでは、空腹のシングルトンは怠zyなシングルトンよりも優れています。 C ++では、一般的に怠zyなシングルトンが使用されています。
シングルトンのパターンは比較的単純なので、ここでコードのデモを例に挙げません。