Javaベース-設計モデルの一例
3266 ワード
一.定義と概念
1.シングル・インスタンス・モードは、Javaで一般的な設計モードであり、クラスにインスタンスが1つしかないことを確認し、独自にインスタンス化し、システム全体にこのインスタンスを提供するために使用されます.
2.単例設計モードは以下の三つの特徴がある:
1、単一のクラスには1つのインスタンスしかありません.
2、単一のインスタンスクラスは、独自の一意のインスタンスを作成する必要があります.
3、単一のクラスは、他のすべてのオブジェクトにこのインスタンスを提供する必要があります.
3.コンピュータシステムでは、スレッドプール、キャッシュ、ログオブジェクト、ダイアログボックス、プリンタ、グラフィックスカードのドライバオブジェクトが一例として設計されることが多い.これらのアプリケーションは、リソースマネージャの機能を多かれ少なかれ備えています.各コンピュータにはいくつかの印刷が可能です
プリンタに2つの印刷ジョブが同時に出力されないようにするには、プリンタが1つしかありません.各コンピュータにはいくつかの通信ポートがあり、システムはこれらの通信ポートを集中的に管理し、1つの通信ポートが同時に
2つのリクエストが同時に呼び出されます.要するに、単例モデルを選んだのは、不一致状態を避け、政出多頭を避けるためだ.
4.単例設計モードの構成要素
①私有の構造方法
②自分のインスタンスへの静的参照
③自己インスタンスを戻り値とする公有の方法
二.分類の説明
単例設計パターンは、実例化対象のタイミングによって、1餓漢式単例2怠け者式単例3登録式単例の3種類に分けられる.
①餓漢式単例
餓漢式は、クラスがロードを初期化しながら(インスタンス化ではなく)システムで使用するために静的オブジェクトを作成し、その後は変更しません.
質問1:プライベート構造方法?
コンストラクションメソッドをprivateに限定すると、クラスが外部でインスタンス化されることを防止できます.すなわち、単一のクラスの一意のインスタンスは、そのインスタンスクラス内のメソッドのみを通過することができます.
(getInstance()を取得します.
問題2:線形セキュリティ?
はい!
②怠け者のケース
怠け者の単一例は、取得インスタンスメソッド(getInstance()メソッド)を呼び出すとオブジェクトがインスタンス化されるので、遅延ロードでその特徴を表すこともできます.
餓漢式とは異なり、怠け者式はマルチスレッドでセキュリティの問題が発生する可能性があります.すなわち、複数のSingletonインスタンスが発生する可能性があります.そのため、スレッドのセキュリティを保証するためのいくつかの措置が必要です.
方法1:getInstanceメソッドに同期を加える
public static synchronized Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
この方法はスレッドセキュリティの問題を解決するが,複数のスレッドアクセスがある場合には頻繁にロックを判断する必要があり,性能はあまり高くない.
改善された第2の方法があります
方法2:二重チェックロック
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
}
三.各方法の長所と短所
1.怠け者式と餓漢式の違い
餓漢はクラスがいったんロードされると、単例の初期化が完了し、getInstanceの時に単例がすでに存在することを保証する.
怠け者は怠け者で、getInstanceを呼び出すときだけインスタンスを初期化します.
1.スレッドセキュリティ
餓漢式天生スレッドは安全で、問題なくマルチスレッドを直接使用できます
怠け者式自体のスレッドは安全ではなく、上記の2つの方法でスレッドの安全を実現することができます.
2.リソースのロードとパフォーマンス
餓漢式はクラスの作成と同時に静的オブジェクトをインスタンス化し、その後この単例を使用するかどうかにかかわらず、一定のメモリを占有しますが、それに応じて、
リソースの初期化が完了したため、最初の呼び出しの速度も速くなります.
怠け者式はその名の通りロードが遅延し、この単例を初めて使用したときにオブジェクトがインスタンス化され、最初の呼び出し時に初期化されます.
仕事が多く、性能的に多少遅れてしまいますが、その後は餓漢式と同じです.
2.シングルモードのメリット
1.メモリにオブジェクトが1つしかないため、メモリ容量を節約
2.頻繁なオブジェクトの作成と破棄を回避し、パフォーマンスを向上
3.共有リソースの多重占有を避ける
4.グローバルアクセス可能
四.まとめ
一般的にJavaでは、天然スレッドが安全なため、餓漢式がよく使われています.しかし、怠け者式の各特徴と変形スレッドの安全は依然として把握しなければならない.
1.シングル・インスタンス・モードは、Javaで一般的な設計モードであり、クラスにインスタンスが1つしかないことを確認し、独自にインスタンス化し、システム全体にこのインスタンスを提供するために使用されます.
2.単例設計モードは以下の三つの特徴がある:
1、単一のクラスには1つのインスタンスしかありません.
2、単一のインスタンスクラスは、独自の一意のインスタンスを作成する必要があります.
3、単一のクラスは、他のすべてのオブジェクトにこのインスタンスを提供する必要があります.
3.コンピュータシステムでは、スレッドプール、キャッシュ、ログオブジェクト、ダイアログボックス、プリンタ、グラフィックスカードのドライバオブジェクトが一例として設計されることが多い.これらのアプリケーションは、リソースマネージャの機能を多かれ少なかれ備えています.各コンピュータにはいくつかの印刷が可能です
プリンタに2つの印刷ジョブが同時に出力されないようにするには、プリンタが1つしかありません.各コンピュータにはいくつかの通信ポートがあり、システムはこれらの通信ポートを集中的に管理し、1つの通信ポートが同時に
2つのリクエストが同時に呼び出されます.要するに、単例モデルを選んだのは、不一致状態を避け、政出多頭を避けるためだ.
4.単例設計モードの構成要素
①私有の構造方法
②自分のインスタンスへの静的参照
③自己インスタンスを戻り値とする公有の方法
二.分類の説明
単例設計パターンは、実例化対象のタイミングによって、1餓漢式単例2怠け者式単例3登録式単例の3種類に分けられる.
①餓漢式単例
public class Singleton {
// 1:
private static final Singleton singleton = new Singleton();
// 2:
private Singleton() {
}
// 3:
public static Singleton getInstance() {
return singleton;
}
}
餓漢式は、クラスがロードを初期化しながら(インスタンス化ではなく)システムで使用するために静的オブジェクトを作成し、その後は変更しません.
質問1:プライベート構造方法?
コンストラクションメソッドをprivateに限定すると、クラスが外部でインスタンス化されることを防止できます.すなわち、単一のクラスの一意のインスタンスは、そのインスタンスクラス内のメソッドのみを通過することができます.
(getInstance()を取得します.
問題2:線形セキュリティ?
はい!
②怠け者のケース
public class Singleton {
// 1:
private static Singleton singleton;
// 2:
private Singleton() {
}
// 3:
public static Singleton getInstance() {
if(singleton==null){
singleton = new Singleton();
}
return singleton;
}
}
怠け者の単一例は、取得インスタンスメソッド(getInstance()メソッド)を呼び出すとオブジェクトがインスタンス化されるので、遅延ロードでその特徴を表すこともできます.
餓漢式とは異なり、怠け者式はマルチスレッドでセキュリティの問題が発生する可能性があります.すなわち、複数のSingletonインスタンスが発生する可能性があります.そのため、スレッドのセキュリティを保証するためのいくつかの措置が必要です.
方法1:getInstanceメソッドに同期を加える
public static synchronized Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
この方法はスレッドセキュリティの問題を解決するが,複数のスレッドアクセスがある場合には頻繁にロックを判断する必要があり,性能はあまり高くない.
改善された第2の方法があります
方法2:二重チェックロック
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
}
三.各方法の長所と短所
1.怠け者式と餓漢式の違い
餓漢はクラスがいったんロードされると、単例の初期化が完了し、getInstanceの時に単例がすでに存在することを保証する.
怠け者は怠け者で、getInstanceを呼び出すときだけインスタンスを初期化します.
1.スレッドセキュリティ
餓漢式天生スレッドは安全で、問題なくマルチスレッドを直接使用できます
怠け者式自体のスレッドは安全ではなく、上記の2つの方法でスレッドの安全を実現することができます.
2.リソースのロードとパフォーマンス
餓漢式はクラスの作成と同時に静的オブジェクトをインスタンス化し、その後この単例を使用するかどうかにかかわらず、一定のメモリを占有しますが、それに応じて、
リソースの初期化が完了したため、最初の呼び出しの速度も速くなります.
怠け者式はその名の通りロードが遅延し、この単例を初めて使用したときにオブジェクトがインスタンス化され、最初の呼び出し時に初期化されます.
仕事が多く、性能的に多少遅れてしまいますが、その後は餓漢式と同じです.
2.シングルモードのメリット
1.メモリにオブジェクトが1つしかないため、メモリ容量を節約
2.頻繁なオブジェクトの作成と破棄を回避し、パフォーマンスを向上
3.共有リソースの多重占有を避ける
4.グローバルアクセス可能
四.まとめ
一般的にJavaでは、天然スレッドが安全なため、餓漢式がよく使われています.しかし、怠け者式の各特徴と変形スレッドの安全は依然として把握しなければならない.