一例モード理解
1533 ワード
単例モードの意味
プロセス指向言語では、パラメータの割り当てと参照は、グローバル変数によって達成されます.しかし、完全に対象に向かっている環境ではグローバル変数の存在は認められません.この問題を解決する方法は何がありますか?この目標を達成するために、共通のクラスを作成することができます.メンバー変数は具体的なオブジェクトに合わせて使用する必要があります.使用する時は、オブジェクトを転送する必要があります.そこで,静的大域変数をこの目標として用いたいと考えた.クラスを参照するだけで、クラスの静的な大域変数を利用して実装できます.しかし、完全に対象に向かう意味では、万物は対象であり、このような共有メンバー変数を使うのはこの考えに合わない.これを考慮して、単一のパターンが生まれました.特に、読み取り、グローバル一意のメッセージキュー、一意のスレッドプールなどのシーンモードの使用に適しています.
一例モードの実現
一例のモードはどうやってグローバル唯一を確保しますか?まず、任意のクラスのオブジェクトを具体化するには、構成関数を介してメモリを申請し、メンバー変数を初期化し、メモリを割り当てるポインタ操作が必要です.クラスの構造関数をプライベートにすると、クラスの構造によって直接的にインスタンスオブジェクトを得ることができなくなります.この場合はクラスの静的方法でしか取得できません.静的方法は静的変数しか使用できないので,生成したオブジェクトはクラスの静的変数でなければならない.クラスの共通インターフェースによって、クラスのインスタンスを取得する.静的変数によって生成されるタイミングは、餓漢式(最初の初期化時に実行対象が生成される)と怠け者式(申請対象時のみ対象が生成される)に分けられます.静的変数の初期化は一回しかないので、餓漢式はマルチスレッドの安全性に問題がない.しかし、静的コンパイル段階では、初期化データが多すぎると、初期化性能が低下します.マルチスレッド条件では、怠け者モードは、唯一のインスタンスオブジェクトを生成するため、各スレッドは、オブジェクトを生成する可能性があります.スレッドの安全を確保するため、通常はスレッドにロックをかける.ただし、ロックをかけると、一定の性能が低下します.特に高合併、高性能のシーンです.
性能分析
実例
プロセス指向言語では、パラメータの割り当てと参照は、グローバル変数によって達成されます.しかし、完全に対象に向かっている環境ではグローバル変数の存在は認められません.この問題を解決する方法は何がありますか?この目標を達成するために、共通のクラスを作成することができます.メンバー変数は具体的なオブジェクトに合わせて使用する必要があります.使用する時は、オブジェクトを転送する必要があります.そこで,静的大域変数をこの目標として用いたいと考えた.クラスを参照するだけで、クラスの静的な大域変数を利用して実装できます.しかし、完全に対象に向かう意味では、万物は対象であり、このような共有メンバー変数を使うのはこの考えに合わない.これを考慮して、単一のパターンが生まれました.特に、読み取り、グローバル一意のメッセージキュー、一意のスレッドプールなどのシーンモードの使用に適しています.
一例モードの実現
一例のモードはどうやってグローバル唯一を確保しますか?まず、任意のクラスのオブジェクトを具体化するには、構成関数を介してメモリを申請し、メンバー変数を初期化し、メモリを割り当てるポインタ操作が必要です.クラスの構造関数をプライベートにすると、クラスの構造によって直接的にインスタンスオブジェクトを得ることができなくなります.この場合はクラスの静的方法でしか取得できません.静的方法は静的変数しか使用できないので,生成したオブジェクトはクラスの静的変数でなければならない.クラスの共通インターフェースによって、クラスのインスタンスを取得する.静的変数によって生成されるタイミングは、餓漢式(最初の初期化時に実行対象が生成される)と怠け者式(申請対象時のみ対象が生成される)に分けられます.静的変数の初期化は一回しかないので、餓漢式はマルチスレッドの安全性に問題がない.しかし、静的コンパイル段階では、初期化データが多すぎると、初期化性能が低下します.マルチスレッド条件では、怠け者モードは、唯一のインスタンスオブジェクトを生成するため、各スレッドは、オブジェクトを生成する可能性があります.スレッドの安全を確保するため、通常はスレッドにロックをかける.ただし、ロックをかけると、一定の性能が低下します.特に高合併、高性能のシーンです.
性能分析
実例
// C#
class singleInstance {
private singleInstance(){};
static singleInstace _instance;
public static singleInstance get_instance(){
if (_instance == NULL)
{
if (lock( MyLock))
{
if (_instance == NULL)
{
_instance = new singleInstace();
}
}
}
return _instance;
};
// C#
class singleInstance {
private singleInstance(){};
static singleInstace _instance = new sigleInstace();
public static singleInstance get_instance(){
return _instance;
};