C++单例模式之注册表方法

来源:互联网 发布:java 计算时间戳差值 编辑:程序博客网 时间:2024/06/17 00:34
#include <iostream>#include <typeinfo>#include <map>using namespace std;class Singleton1{private:    static map<string, Singleton1*> mapList;    static Singleton1* _instance;public:    static Singleton1* GetInstance(string name){        _instance = LookUp(name);        return _instance;    }    static void Register(string name, Singleton1* single){        Singleton1* regist = LookUp(name);        if (regist != NULL){            return;        }else{            mapList.insert(make_pair(name, single));        }    }protected:    static Singleton1* LookUp(string name){        map<string, Singleton1*>::iterator iter = mapList.find(name);        if (iter != mapList.end())            return iter->second;        else            return NULL;    }};Singleton1* Singleton1::_instance = NULL;map<string, Singleton1*> Singleton1::mapList;class MySingleton : public Singleton1{private:    MySingleton(){    }public:    static void Regist(){        Singleton1::Register("MySingleton",new MySingleton());    }    void Print(){        cout << "this is MySingleton" << endl;    }};class MySingleton1 : public Singleton1{private:     MySingleton1(){}public:    static void Regist(){        Singleton1::Register("MySingleton1",new MySingleton1());    }    void Print(){        cout << "this is MySingleton1" << endl;    }};static void before_main(){    cout << "before main" << endl;    MySingleton::Regist();    MySingleton1::Regist();}static void before_main() __attribute__((constructor));int main(){    cout << "--Singleton1--" << endl;    Singleton1* obj1 = MySingleton::GetInstance("MySingleton");    Singleton1* obj2 = MySingleton::GetInstance("MySingleton");    cout << obj1 << endl;    cout << obj2 << endl;    MySingleton* my1 = (MySingleton*)obj1;    MySingleton* my2 = (MySingleton*)obj2;    my1->Print();    my2->Print();    Singleton1* ob1 = MySingleton::GetInstance("MySingleton1");    Singleton1* ob2 = MySingleton::GetInstance("MySingleton1");    cout << ob1 << endl;    cout << ob2 << endl;    MySingleton1* my11 = (MySingleton1*)ob1;    MySingleton1* my12 = (MySingleton1*)ob2;    my11->Print();    my12->Print();    return 0;}


0 0
原创粉丝点击