設計モードの一例モード(C++コード実装)

5917 ワード

1、単例モード:
≪単一モード|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; 
}
1if(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; 
}