【C++】設計モード全解析——単例モード(code c++)


目次&索引
  • 単例モード
  • プログラムコード
  • 怠け者式実現:lock、スレッド安全code c++
  • 餓漢式実現:スレッド安全code c++

  • 結論
  • 単一モード
    クラスにインスタンスが1つしかないことを保証し、そのグローバル・アクセス・ポイントにアクセスします.
  • の主な解決:グローバルに使用されるクラスが頻繁に作成され、破棄されます.
  • いつ使用するか:インスタンスの数を制御し、システムリソースを節約したい場合.
  • は、システムに単一のインスタンスが存在するかどうかを判断し、存在する場合は戻り、存在しない場合は作成します.
  • キーコード:デフォルトの構築プライベート、コピー構築プライベート(delete注意).
  • 単例の実現は主に2種類ある:怠け者式と餓漢式
  • 怠け者:だから名は意味を考えて、やむを得ず実例化類に行かないで、つまり初めて類の実例を使う時やっと実例化に行くので、上の経典の方法は怠け者の実現に帰されます.
  • 餓漢:お腹が空いたら必ずお腹が空いて食べ物を選ばない.したがって,単例クラス定義の際にインスタンス化する.

  • 特徴と選択:
  • はアクセスが少なく、怠け者で実現しています.複雑さを実現するには、スレッドの安全を保証します.これは時間で空間を変えます.
  • スレッド同期を行うため、アクセス量が大きい場合や、アクセスするスレッドが多い場合は、餓漢で実現し、より良い性能を実現することができます.これは空間で時間を変えます.

  • プログラムコード
    怠け者式実現:lock、スレッドセキュリティcode c++
    #include 
    #include 
    using namespace std;
    
    class SingleInstance {
         
    public :
        static SingleInstance *getInstance() {
          //    , 1        , 2     
            if (single == nullptr) {
          //          
                unique_lock<mutex> lock(Instance_mutex); //    ,     
                if (single == nullptr) {
         
                    single = new SingleInstance();
                }
            }
            return single;
        }
    private:
        SingleInstance(); //        
        SingleInstance(const SingleInstance &) = delete; //       
        static SingleInstance *single;
        static mutex Instance_mutex;
    };
    
    SingleInstance *SingleInstance::single = nullptr; //            
    mutex SingleInstance::Instance_mutex;
    
    int main() {
          //         ,     
        SingleInstance *s1 = SingleInstance::getInstance();
        return 0;
    }
    
    

    餓漢式実現:スレッド安全code c++
    #include 
    using namespace std;
    
    class SingleInstance {
         
    public :
        static SingleInstance *getInstance() {
          //    , 1        , 2     
            return single;
        }
    private:
        SingleInstance(); //        
        SingleInstance(const SingleInstance &) = delete; //       
        static SingleInstance *single;
    };
    
    SingleInstance *SingleInstance::single = nwe SingleInstance(); //           single       
    
    int main() {
          //         ,     
        SingleInstance *s1 = SingleInstance::getInstance();
        return 0;
    }
    
    

    結論
    コード例、問題メッセージがあります.