単一例(Singleton)


≪単一モード|Single Mode|emdw≫:クラスにインスタンスが1つしかないことを確認し、グローバル・アクセス・ポイントを提供します.これらのクラスには、スレッドプール、キャッシュ、ダイアログボックス、処理の好み設定、レジストリのオブジェクト、ログオブジェクト、プリンタ、グラフィックスカードなどのデバイスのドライバオブジェクトなどが含まれます.
要点:
1.単一のモードでは、プログラム内の1つのクラスに1つのインスタンスしかないことを確認します.
2.シングル・インスタンス・モードでは、このインスタンスにアクセスするグローバル・ポイントも提供されます.
3.パフォーマンスおよびリソースの制約を特定し、マルチスレッドの問題を解決するために適切なスキームを慎重に選択して、単一のデバイスを実装する
4.複数のクラス・ローダを使用すると、単一のインスタンスが失効し、複数のインスタンスが生成される可能性があります.
パフォーマンスがアプリケーションにとって重要でない場合:

#include<iostream>
#include<stdlib.h>
using namespace std;

class Singleton{
private:
    Singleton(){}
public:
    static Singleton* singleton;
    static Singleton* getInstance(){
        if(singleton==NULL){
           singleton = new Singleton;//        
        }
        return singleton;
    }
    void fun(){
        cout << "this is a singleton" << endl;
    }
};
//             
Singleton* Singleton::singleton = NULL;

int main(){
    Singleton::getInstance()->fun();
}


常に急いで使用する場合は、インスタンス化を遅らせる必要はありません.

#include<iostream>
#include<stdlib.h>
using namespace std;

class Singleton{
private:
    Singleton(){}
public:
    static Singleton* singleton;
    static Singleton* getInstance(){
        return singleton;
    }
    void fun(){
        cout << "this is a singleton" << endl;
    }
};

//     ,   
Singleton* Singleton::singleton = new Singleton;

int main(){
    Singleton::getInstance()->fun();
}


マルチスレッド

#include<iostream>
#include<auto_ptr.h>
using namespace std;

class Singleton{
private:
    Singleton(){}
public:
    static Singleton* getInstance(){
        typedef auto_ptr<Singleton> singletonPtr;
        static singletonPtr singleton;
        if(singleton.get()==NULL){
            singleton.reset(new Singleton);
        }
        return singleton.get();
    }
    void fun(){
        cout << "this is a singleton" << endl;
    }
};

int main()
{
    Singleton::getInstance()->fun();
}