C++動態建立及工廠模式的模擬
阿新 • • 發佈:2019-02-19
#ifndef _FS_H
#define _FS_H
#pragma once
#include <string>
#include <map>
#include <iostream>
using namespace std;
typedef void* (*CreateClass)(void);
/*@類工廠,通過一個MAP成員來實現類名與類的例項化物件函式的對映
* @向外部提供一個介面函式,通過類名來建立該類物件
* @MAP是靜態的,這樣可以在程式執行前就可以存在
*/
class ClassFactory
{
public:
static void* GetClassByName(string className)
{
map<string,CreateClass>::const_iterator iter;
iter = m_classMap.find(className);
if(iter==m_classMap.end())
return NULL;
else
return iter->second();
}
static void RegistClass(string name,CreateClass method)
{
m_classMap.insert(pair<string,CreateClass>(name,method));
}
private:
static map<string,CreateClass> m_classMap;
};
map<string,CreateClass> ClassFactory::m_classMap;
/*@動態建立類,動態建立的類通過包含該類的一個靜態物件
*向類工廠裡註冊自己的建立物件函式
*/
class GenDynamic
{
public:
GenDynamic(string name,CreateClass method)
{
ClassFactory::RegistClass(name,method);
}
};
/*@定義巨集,類通過包含該巨集,實現動態建立*/
#define DECLARE_RUNTIME(class_name)\
string class_name##Name;\
static GenDynamic* class_name##gd
/*@巨集實現,類通過實現該巨集,實現動態建立*/
#define IMPLEMENT_RUNTIME(class_name)\
GenDynamic* class_name::class_name##gd\
= new GenDynamic(#class_name,class_name::CreateInstance);
/*@頂層父類*/
class CObject
{
private:
DECLARE_RUNTIME(CObject);
public:
CObject()
{
}
static void* CreateInstance()
{
return new CObject;
}
virtual void display()
{
cout<<"CObject display()"<<endl;
}
};
IMPLEMENT_RUNTIME(CObject)
/*@一個子類*/
class Csun:public CObject
{
private:
DECLARE_RUNTIME(Csun);
public:
Csun()
{
}
static void* CreateInstance()
{
return new Csun;
}
virtual void display()
{
cout<<"Csun display()"<<endl;
}
};
IMPLEMENT_RUNTIME(Csun)
#define _FS_H
#pragma once
#include <string>
#include <map>
#include <iostream>
using namespace std;
typedef void* (*CreateClass)(void);
/*@類工廠,通過一個MAP成員來實現類名與類的例項化物件函式的對映
* @向外部提供一個介面函式,通過類名來建立該類物件
* @MAP是靜態的,這樣可以在程式執行前就可以存在
*/
class ClassFactory
{
public:
static void* GetClassByName(string className)
{
map<string,CreateClass>::const_iterator iter;
iter = m_classMap.find(className);
if(iter==m_classMap.end())
return NULL;
else
return iter->second();
}
static void RegistClass(string name,CreateClass method)
{
m_classMap.insert(pair<string,CreateClass>(name,method));
}
private:
static map<string,CreateClass> m_classMap;
};
map<string,CreateClass> ClassFactory::m_classMap;
/*@動態建立類,動態建立的類通過包含該類的一個靜態物件
*向類工廠裡註冊自己的建立物件函式
*/
class GenDynamic
{
public:
GenDynamic(string name,CreateClass method)
{
ClassFactory::RegistClass(name,method);
}
};
/*@定義巨集,類通過包含該巨集,實現動態建立*/
#define DECLARE_RUNTIME(class_name)\
string class_name##Name;\
static GenDynamic* class_name##gd
/*@巨集實現,類通過實現該巨集,實現動態建立*/
#define IMPLEMENT_RUNTIME(class_name)\
GenDynamic* class_name::class_name##gd\
= new GenDynamic(#class_name,class_name::CreateInstance);
/*@頂層父類*/
class CObject
{
private:
DECLARE_RUNTIME(CObject);
public:
CObject()
{
}
static void* CreateInstance()
{
return new CObject;
}
virtual void display()
{
cout<<"CObject display()"<<endl;
}
};
IMPLEMENT_RUNTIME(CObject)
/*@一個子類*/
class Csun:public CObject
{
private:
DECLARE_RUNTIME(Csun);
public:
Csun()
{
}
static void* CreateInstance()
{
return new Csun;
}
virtual void display()
{
cout<<"Csun display()"<<endl;
}
};
IMPLEMENT_RUNTIME(Csun)
#endif
測試程式:
#include "H1.h"
class Ctest:public CObject
{
private:
DECLARE_RUNTIME(Ctest);
public:
Csun()
{
}
static void* CreateInstance()
{
return new Ctest;
}
virtual void display()
{
cout<<"Ctest display()"<<endl;
}
};
IMPLEMENT_RUNTIME(Ctest)
void main()
{
CObject* p = (CObject*)ClassFactory::GetClassByName("Ctest");
p->display();
return;
}
要使建立的類支援動態建立,只要加入自定義的2個巨集,便會向工廠類註冊,工廠類便可產生該物件。