シングルトンモード
クラスのインスタンスが1つしかないために、動機が重要な場合があります。たとえば、システムには1つのウィンドウ管理インスタンスのみが必要です。
Singletonパターンは最も単純なデザインパターンです。クラスは、インスタンスをインスタンス化し、1つのインスタンスしかないことを確認し、このインスタンスにアクセスするためのエントリを提供する責任があります。
目的
1. 1つのインスタンスのみが作成されていることを確認してください。
2。このインスタンスにアクセスするためのエントリを提供します。
ファイナルを使用して1回作成され、プライベートコンストラクターはインスタンス化されないようにします。 getinstanceの公開方法により、外部アクセスが可能になります。以下は空腹モードです。
パブリッククラスシングルトン{プライベート静的最終シングルトンインスタンス= new Singleton(); private singleton(){} public static singleton getInstance(){return instance; }}
レイジーモード:
Public Class Singletondemo {private static volatile singletondemo instance = null; private singletondemo(){} public static singletondemo getInstance(){if(instance == null){synchronized(singletondemo .class){if(instance == null){instance = new singletondemo(); }} return instance; }}
適用されるシナリオと例
1.ロガークラスは、ログが印刷されるたびにロガーインスタンスの作成を防ぎます。
2。制御クラス、通常、システム全体にコントロールインスタンスは1つだけです。
特定の問題と実装
1。スレッドセーフ、堅牢なシングルトンモードは、スレッドセーフである必要があります。
2。Lazyモードは、ダブルロックメカニズムを使用します。
3.イーグルモードは静的変数を使用し、プログラムのロード時にインスタンス化され、1つのインスタンスのみがあることを確認します。
4。抽象的な工場と工場の方法は、通常、シングルトンパターンとして設計されており、工場が1つしかないことを確認します。
5.シリアル化と脱介入を使用する場合、複数のインスタンスが作成されます。これを回避するには、ReadResolve関数を使用しますが、シリアル化を使用しないことをお勧めします。
Public Class Singletonは、Serializable {... //このメソッドは、このクラスのオブジェクトが脱色後すぐに呼び出されます。 //このメソッドはSingletonインスタンスを返します。保護されたオブジェクトreadResolve(){return getInstance(); }}
キーポイント
1.マルチスレッドプログラムでは、データの同期に注意してください。
2.シリアル化するときは、ReadResolveメソッドを使用してインスタンスを返して、作成されている複数のオブジェクトを避けます。
3.複数のクラスローダーでロードされると、複数のインスタンスが作成されます。
単純な工場モード
動機付けの単純な工場モデルは、抽象的な工場および工場の方法の基礎と予備的な実装です。
目的
1.オブジェクトのインスタンス化の詳細をクライアントに開示しないでください。
2。共通のインターフェイスを介してオブジェクトを作成します。
成し遂げる
実装は非常に簡単です:
1.クライアントが製品を必要とする場合、それは新しいものを使用するのではなく、工場に製品の説明を提供し、工場が新しい製品を提供できるようにします。
2。工場では、クライアントに製品をインスタンス化します。
3.クライアントは、製品の具体的な実装を気にせずに抽象製品を使用します。
例
1。形状を描くための描画プログラム。形状は製品インターフェイスであり、三角形はコンクリート製品です。工場を作成してから、顧客の説明に従って製品を作成できます。ただし、新しい形状を追加するときは、工場クラスを変更する必要があります。
特定の問題と実装
1.新製品を追加する場合、工場を変更する必要があります。
Public Class ProductFactory {public Product createProduct(String ProductID){if(id == id1)return new OneProduct(); if(id == id2)new new AnotherProduct()を返します。 ... //他のIDの場合はnullを返します。 // IDに期待値がない場合} ...}一般的に、IFステートメントを使用して製品の説明を判断し、さまざまな製品をインスタンス化します。新製品がある場合、新しい判断を追加する必要があります。この問題は、抽象的な工場パターンによって解決できます。
要約します
1.ファクトリーモードが本当に必要な場合にのみ使用します。そうしないと、プログラムの複雑さを高めるだけです。たとえば、複数のオブジェクトに同様の基本タイプがある場合、単純な工場モードを使用してオブジェクトを均一に作成することを検討できます。
2。単純な工場には、より多くの判断支部声明があり、これは修正の開設と閉鎖の原則に違反しています。したがって、いくつかの固定および単純なプログラムにシンプルな工場モードを使用し、複雑で頻繁に拡張されたプログラムに抽象的な工場モードまたはファクトリーメソッドモードを使用することが賢明です。