template <class T>
class Singleton
{
public:
static T* Instance()
{
static T t;
return &t;
}
protected:
Singleton(){ }
virtual ~Singleton(){ }
private:
Singleton(const Singleton& source){ }
};
这是一个单例类,在Instance()中定义一个static T t;该类得所有对象调用这个函数时将共享这个static变量,由于Instance()又是Singleton的成员函数,所以Singleton的所有对象都共享这个静态局部变量
单例模式:单例模式是一种常用的设计模式,核心结构是一个称为单例类的特殊类,单例模式保证系统只有一个对象而且易于外界访问,从而对实例个数控制而且节约系统资源,如果希望系统中只有一个类得对象,单例模式是最好的选择。通常构造函数是私有的,防止外界进行实例化,接口通常被定义成static成员函数来获取实例。
class CBaseLocker
{
public:
CBaseLocker()
{
#ifndef _ACE_WRAPPER_
::InitializeCriticalSection(&m_cs);
#endif
}
virtual ~CBaseLocker()
{
#ifndef _ACE_WRAPPER_
::DeleteCriticalSection(&m_cs);
#endif
}
void Lock()
{
#ifndef _ACE_WRAPPER_
::EnterCriticalSection(&m_cs);
#else
ACE_GUARD(ACE_SYNCH_MUTEX, monitor, lock_);
#endif
}
void Unlock()
{
#ifndef _ACE_WRAPPER_
::LeaveCriticalSection(&m_cs);
#else
#endif
}
private:
#ifdef _ACE_WRAPPER_
ACE_SYNCH_MUTEX lock_;
#else
CRITICAL_SECTION m_cs;//临界区
#endif
};
--这是关于临界区使用的类声明,提供了几个使用临界区的接口
class CEStnDefinition : public Singleton<CEStnDefinition>
, public CBaseLocker
{
public:
// 装载基础信息
BOOL LoadBasicInfo();
BOOL GetLineOperatingVehicle(CMapLineOperatingVehicle& mapLineOperVehi);
BOOL GetFenceInfo(CMapLineRegin& mapLineFence);
//BOOL GetDockingRegion(CArrayDockingRegion& arrDockRegion, CMapLineDockingStnRgn& mapLineDockingStnRgn);
CAcliBasicInfo& GetAcliBasicInfo()
{
return m_AcliBasicInfo;
}
private:
CAcliBasicInfo m_AcliBasicInfo; // 基础数据
CADOAccessor* m_pDBAccess;
BOOL GetDBAccess();
};
这是一个多重继承的类,这样这个类继承了单例类的接口和临界区的接口,这个类中需要访问数据库,数据库访问有时需要这种模式。