#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;
}
C++单例模式之注册表方法
最新推荐文章于 2022-03-03 16:12:10 发布