学んで時習する単例モード

2896 ワード

本文は主に単例モードの概念,応用,およびC++実現を説明する.
I、神の視点から見た単例モード
1.1単例パターンの特徴
単例モードは以下の2つの条件を満たす必要がある:1、1つのクラスが1つのインスタンスだけを作成することを保証する;2.このインスタンスに対するグローバルアクセスポイントを提供する.
1.2単一モードの適用例
システムが類似のエンティティ(1つのみであり、グローバルアクセスが必要)を必要とする場合は、単一の例として実装できます.その主な応用は:1、ログクラス、1つの応用は往々にして1つのログインスタンスにしか対応しない;2、クラスの構成、アプリケーションの構成を集中的に管理し、グローバルアクセスを提供する.3、管理器、例えばタスク管理器は典型的な一例である.4、共有リソースクラスは、リソースをロードするのに時間がかかります.単一の例を使用すると、リソースの重複ロードを回避し、複数の場所で共有アクセスすることができます.
II、単例モード実現
2.1 lazy Singleton
コード実装:
class Singleton
{
public:
    /*   static Instance()  ,       ;
     *         ,     ;
     *    ,              static   
    */
     /* Instance()              ,            delete   。
      *   Instance()     ,      ,            (Lazy Singleton)
     */
    /*              ,     A B
     *     instance==nullptr  ,             ,           。
    */
    static Singleton& Instance() {
        if (instance == nullptr)
            instance = new Singleton;
        return *instance;
    }

private:
    //           ,               ,             
    Singleton();
    ~Singleton();
    Singleton(const Singleton&);
    Singleton& operator=(const Singleton&);

private:
    static Singleton* instance;
};

2.2 Eager Singleton
/* Eager Singleton */
/*                   。 Lazy  ;
 *   static   main       ,           ;
 *          no-local static  (    static  )
 *                    。
 *              Instance()              。
 *               。
*/
class Singleton
{
public:
    static Singleton& Instance() {
        return instance;
    }
private:
    Singleton();
    ~Singleton();
    Singleton(const Singleton&);
    Singleton& operator=(const Singleton&);

private:
    static Singleton instance;
};

2.3 Meyers Singleton
/* Meyers Singleton*/
/*    effective C++        ,  local static  
 *          Instance()        。
*/
class Singleton
{
public:
    static Singleton& Instance() {
        static Singleton instance;
        return instance;
    }
private:
    Singleton();
    ~Singleton();
    Singleton(const Singleton&);
    Singleton& operator=(const Singleton&);

};

2.4 Double-checked Locking Pattern
Lazy Singletonのスレッドセキュリティ改造は、Instance()の中でnullptrであるか否かを判断するたびにロックされるが、ロックは遅い.実際には、最初のインスタンスが作成されたときにのみロックが必要です.では、その前にインスタンスが作成されているかどうかを判断すればよいので、ロックをかける前に判断を加えることが多いので、Double-checkedと呼ばれます.理論的には問題は解決したが、実際には多くの穴がある.ここでは説明しません.
static Singleton& Instance() {
    if (instance == nullptr) {
        Lock lock;    //       ,     ,        
        if (instance == nullptr) {
            instance = new Singleton;
        }
    }
    return *instance;
}

【参考】[1][一例モード及びそのC++実装]https://zkt.name/dan-li-mo-shi-singleton-ji-c-shi-xian/)
転載を歓迎して、転載して出典wenmingxing学の時習の単例のモードを明記してください