設計モードの一例モード(C++コード実装)
5917 ワード
1、単例モード:
≪単一モード|Single Mode|emdw≫:インスタンスが1つしかないユニークなオブジェクトを作成します.単一モードの構造は設計モードの中で最も簡単であるが,スレッドセキュリティを完全に実現するための単一モードには多くのトラップがある.
2、シーンを適用する:
共有データまたは共有アクセスポイント;IOやデータベースへのアクセスなど、オブジェクトを作成するのに消費されるリソースが多すぎます.静的定数と静的メソッド(ツールクラス)を多数定義する必要があります.
単一モードのアプリケーションシーン:Windows Task Manager(タスクマネージャ)、windowsごみ箱、スレッドプール、キャッシュ、ダイアログボックス、処理設定とレジストリのオブジェクト、ログオブジェクト、プリンタ、グラフィックスなどのデバイスのドライバオブジェクトなど、実際には1つしか必要としないオブジェクトがあります.これらのオブジェクトは1つのインスタンスしか持つことができません.複数のインスタンスが作成されると、いくつかのプログラムの問題が発生します.プログラムの動作が異常で、リソースが過剰に使用されたり、不一致な結果をもたらしたりします.データベースの接続やスレッドプールなど、共有リソースを管理するのによく使用されます.
3、メリットとデメリット:
利点:メモリのオーバーヘッドを削減するインスタンス.システムのオーバーヘッドを減らす.1つの資源の多重占有を避ける.グローバル・アクセス・ポイントを設定し、リソースを最適化および貢献します.
欠点:言い訳がなく、拡張性が悪い.テストに不利である.単一の職責の原則と衝突し、単一のモデルは「単一の例を求める」とビジネスロジックを1つのクラスに融合させる.
4、実現
1、古典的な実装(スレッドが安全ではない)
2、怠け者モードと餓漢モード
怠け者:だから名は意味を考えて、やむを得ず実例化類に行かないで、つまり初めて類の実例を使う時やっと実例化に行くので、上の経典の方法は怠け者の実現に帰されます;
餓漢:お腹が空いたら、必ずお腹が空いて食べ物を選ばない.したがって,単例クラス定義の際にインスタンス化する.特徴と選択
違い:スレッド同期を行うため、アクセス量が大きい場合やアクセス可能なスレッドが多い場合は、餓漢で実現し、より良いパフォーマンスを実現できます.これは空間で時間を変えます.アクセスが少ない場合は、怠け者で実現します.これは時間で空間を変えます.
≪単一モード|Single Mode|emdw≫:インスタンスが1つしかないユニークなオブジェクトを作成します.単一モードの構造は設計モードの中で最も簡単であるが,スレッドセキュリティを完全に実現するための単一モードには多くのトラップがある.
2、シーンを適用する:
共有データまたは共有アクセスポイント;IOやデータベースへのアクセスなど、オブジェクトを作成するのに消費されるリソースが多すぎます.静的定数と静的メソッド(ツールクラス)を多数定義する必要があります.
単一モードのアプリケーションシーン:Windows Task Manager(タスクマネージャ)、windowsごみ箱、スレッドプール、キャッシュ、ダイアログボックス、処理設定とレジストリのオブジェクト、ログオブジェクト、プリンタ、グラフィックスなどのデバイスのドライバオブジェクトなど、実際には1つしか必要としないオブジェクトがあります.これらのオブジェクトは1つのインスタンスしか持つことができません.複数のインスタンスが作成されると、いくつかのプログラムの問題が発生します.プログラムの動作が異常で、リソースが過剰に使用されたり、不一致な結果をもたらしたりします.データベースの接続やスレッドプールなど、共有リソースを管理するのによく使用されます.
3、メリットとデメリット:
利点:メモリのオーバーヘッドを削減するインスタンス.システムのオーバーヘッドを減らす.1つの資源の多重占有を避ける.グローバル・アクセス・ポイントを設定し、リソースを最適化および貢献します.
欠点:言い訳がなく、拡張性が悪い.テストに不利である.単一の職責の原則と衝突し、単一のモデルは「単一の例を求める」とビジネスロジックを1つのクラスに融合させる.
4、実現
1、古典的な実装(スレッドが安全ではない)
class Singleton
{
public:
static Singleton* getInstance();
protected:
Singleton(){}
private:
static Singleton *p;
};
Singleton* Singleton::p = NULL;
Singleton* Singleton::getInstance()
{
if (NULL == p)
p = new Singleton();
return p;
}
1、 if(instance==NULL) , 。
: , , , Instance static Singleton , 。
class Singleton {
public:
static Singleton* getInstance();
protected:
Singleton();
private:
static Singleton *instance;
};
// , Instance 。
Singleton* Singleton::instance = new Singleton;
Singleton* Singleton::getInstance()
{
return instance;
}
, , , ~
2、 “ ”。 :
class Singleton {
public:
static Singleton* getInstance();
protected:
Singleton();
private:
static Singleton* instance;
}
Singleton *Singleton::instance = NULL;
Singleton* Singleton::getInstance() {
//check
//
if(_instance == NULL ) {
lock();
if( instance == NULL) {
instance = new Singleton();
}
Unlock();
}
return _instance;
}
, instance , ~
2、怠け者モードと餓漢モード
怠け者:だから名は意味を考えて、やむを得ず実例化類に行かないで、つまり初めて類の実例を使う時やっと実例化に行くので、上の経典の方法は怠け者の実現に帰されます;
餓漢:お腹が空いたら、必ずお腹が空いて食べ物を選ばない.したがって,単例クラス定義の際にインスタンス化する.特徴と選択
違い:スレッド同期を行うため、アクセス量が大きい場合やアクセス可能なスレッドが多い場合は、餓漢で実現し、より良いパフォーマンスを実現できます.これは空間で時間を変えます.アクセスが少ない場合は、怠け者で実現します.これは時間で空間を変えます.
1.
class Singleton
{
public:
static pthread_mutex_t mutex;
static Singleton* getInstance();
protected:
Singleton()
{
pthread_mutex_init(&mutex);
}
private:
static Singleton* p;
};
pthread_mutex_t Singleton::mutex;
Singleton* Singleton::p = NULL;
Singleton* Singleton::getInstance()
{
if (NULL == p)
{
pthread_mutex_lock(&mutex);
if (NULL == p)
p = new Singleton();
pthread_mutex_unlock(&mutex);
}
return p;
}
2.
class Singleton
{
public:
static pthread_mutex_t mutex;
static Singleton* getInstance();
protected:
Singleton()
{
pthread_mutex_init(&mutex);
}
};
pthread_mutex_t Singleton::mutex;
Singleton* Singleton::getInstance()
{
pthread_mutex_lock(&mutex);
static singleton obj;
pthread_mutex_unlock(&mutex);
return &obj;
}
class Singleton
{
public:
static Singleton* getInstance();
protected:
Singleton(){}
private:
static Singleton* p;
};
Singleton* Singleton::p = new Singleton;
Singleton* Singleton::getInstance()
{
return p;
}