单例模式的意思就是只有一个实例。
单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。
单例模式的要点有三个;
一是某个类只能有一个实例;
二是它必须自行创建这个实例;
三是它必须自行向整个系统提供这个实例。
单例模式,也叫单子模式,是一种常用的软件设计模式。
在应用这个模式时,单例对象的类必须保证只有一个实例存在。
许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。
比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,
然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。
实现单例模式的思路是:
一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称);
当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,
如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;
同时我们还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,
只有通过该类提供的静态方法来得到该类的唯一实例。
例:
创建类:
class CTmcDataContainer
{
public:
virtual ~CTmcDataContainer();
static CTmcDataContainer* GetInstance();
void Init();//初始化
void LoadTmcData(CString strPath);//根据指定的路径加载tmc数据
void LoadTmcEvent(CString strPath);//根据指定的路径加载tmc事件
void GetData(DWORD *&pData, int &nSize);//为注册函数提供数据
TmcSdeInterfaceData* GetEventData(); //获取事件数据
private:
CTmcDataContainer();
static CTmcDataContainer *m_pSelf;
char* GetFileData(CString strPath, int &nSize, int &nCur);//获取文件数据
TmcSdeInterfaceData *m_pSdeData; //tmc原始数据
int m_nDataSize;
DWORD *m_pDataAddr;
TmcSdeInterfaceData *m_pEventData;
void ReleaseData(); //释放tmc数据
void ReleaseEvent();//释放tmc事件
};
类实现:
CTmcDataContainer* CTmcDataContainer::m_pSelf = NULL;
int GetTmcData(DWORD *&pData, int &nSize) //注册函数
{
CTmcDataContainer::GetInstance()->GetData(pData, nSize);
return 1;
}
int ReleaseTmcData(DWORD *&pData) //释放数据
{
return 1;
}
CTmcDataContainer::CTmcDataContainer() : //初始化
m_pSdeData(NULL),
m_nDataSize(0),
m_pDataAddr(NULL),
m_pEventData(NULL)
{
}
CTmcDataContainer::~CTmcDataContainer()
{
if (m_pSelf)
{
delete m_pSelf;
m_pSelf = NULL;
}
ReleaseData(); //释放tmc数据
if (m_pSdeData)
{
delete[] m_pSdeData;
m_pSdeData =NULL;
}
ReleaseEvent();//释放tmc事件
if (m_pEventData)
{
delete m_pEventData;
m_pEventData =NULL;
}
if (m_pDataAddr)
{
delete[] m_pDataAddr;
m_pDataAddr = NULL;
}
}
CTmcDataContainer* CTmcDataContainer::GetInstance()
{
if (m_pSelf == NULL)
m_pSelf = new CTmcDataContainer;
return m_pSelf;
}
void CTmcDataContainer::Init()
{
CTmcDataMng *pTmc = (CTmcDataMng *)CSDEControler::GetSDEControl()->GetSysTool(SYSTOOL_TMC);
pTmc->SetRegister(GetTmcData); //注册获取数据方法
pTmc->SetRelease(ReleaseTmcData);//注册释放数据方法
}
void CTmcDataContainer::ReleaseData() //释放tmc数据
{
if (m_pSdeData)
{
for (int i=0; i {
if (m_pSdeData[i].link_list != NULL)
delete[] m_pSdeData[i].link_list;
}
}
}
void CTmcDataContainer::ReleaseEvent()//释放tmc事件
{
if (m_pEventData)
{
if (m_pEventData->link_list)
delete m_pEventData->link_list;
}
}
void CTmcDataContainer::LoadTmcData(CString strPath)//从指定路径加载tmc数据
{}
void CTmcDataContainer::LoadTmcEvent(CString strPath)//从指定路径加载tmc事件
{ }
char* CTmcDataContainer::GetFileData(CString strPath, int &nSize, int &nCur)
{}
void CTmcDataContainer::GetData(DWORD *&pData, int &nSize)
{
pData = m_pDataAddr;
nSize = m_nDataSize;
}
TmcSdeInterfaceData* CTmcDataContainer::GetEventData()
{
return m_pEventData;
}
使用:
TmcSdeInterfaceData *pData = CTmcDataContainer::GetInstance()->GetEventData(); //获取事件数据
阅读(1208) | 评论(0) | 转发(0) |