学習設計モード---C++単例モード


まず、最も簡単な単一のモードの例を示します.コードは以下の通りです.
class NetworkService
{
public:
    //            ,           
    static NetworkService* GetInstance()
    {
        if(m_pInstance == NULL)
        {
            m_pInstance = new NetworkService();
        }
        return m_pInstance;
    }

private:
    //          ,          
    NetworkService();
    static NetworkService* m_pInstance;
};

このプログラムは非常に簡単で、ほとんど問題がないように見えます.NetworkServices::GetInstance()を直接使用すると、オブジェクトポインタが得られます.しかし、このようなプログラムは実際に問題を隠しています.この唯一のオブジェクトはいつ解放されるべきですか.
1つの方法は,まず自己リソースを解析する方法を実装し,GetInstance()によってオブジェクト自身を取得し,この方法を呼び出してdeleteの操作を行うことができる.このような方法は実行可能であるが、実装方法はよくない.少なくとも、外部のプログラムによってこの操作を呼び出すのではなく、プログラム自身に適切な時にリソースを解放させるべきである.
では、単例の対象を分析する方法はありますか?静的変数の特徴を利用してこのような機能を実現することができる.プログラムが終了すると、システムはすべてのグローバル変数または静的変数を自動的に解析することを知っています.また、すべてのクラスの静的メンバー変数も自動的に解析されます.これに基づいて、プログラムが終了したときに、構造関数で単一クラスの一意のインスタンスを消去することを目的として、単一クラスにこのような静的メンバー変数を定義できます.再整備されたコード(他の資料から参照)は、Gargoの静的メンバーを定義します.
class NetworkService
{
public:
    //            ,           
    static NetworkService* GetInstance()
    {
        if(m_pInstance == NULL)
        {
            m_pInstance = new NetworkService();
        }
        return m_pInstance;
    }

private:
    //          ,          
    NetworkService();
    static NetworkService* m_pInstance;

    //        ,    NetworkService        
    class Garbo
    {
    public:
        ~Garbo()
        {
            if(NetworkService::m_pInstance)
            {
                delete m_pInstance;
            }
        }
    };
    //        ,     NetService     garbo     ,
    //         NetService      
    static Garbo garbo;
};

クラスGarboは、クラスNetworkServiceのプライベート埋め込みクラスとして定義され、他の場所で使用されないようにします.
詳細なリファレンス:http://blog.csdn.net/boyhailong/article/details/6645681