Windows Mobile 下使用 Native C++ 开发日志类
2010-02-24 20:01:00 来源:WEB开发网核心提示:std::string& strFilePath){ m_strFilePath = strFilePath; Dispose(); Initialise();}void Logger::SetLogLevel( const LOG_LEVEL enLogLevel){ m_enLogLevel = enLogLeve
std::string& strFilePath){ m_strFilePath = strFilePath; Dispose();
Initialise();}void Logger::SetLogLevel( const LOG_LEVEL enLogLevel){
m_enLogLevel = enLogLevel;}Logger::Logger(){ Initialise();}//never
useLogger::~Logger(){ Dispose();}void Logger::Initialise(){ if(
m_strFilePath.length() > 0 ) { m_hLogFile = fopen(m_strFilePath.c_str(),
"a+"); }}void Logger::Dispose(){ if( NULL != m_hLogFile ) { fflush( m_hLogFile
); fclose( m_hLogFile ); m_hLogFile = NULL; }}void Logger::Log( LOG_LEVEL
enLogLevel ,const TCHAR *format, ... ){ if( m_enLogLevel > enLogLevel) {
return; }#ifndef DEBUG if ( NULL == m_hLogFile ) { return; }#endif TCHAR
szBuffer[1024]; va_list args; va_start(args, format); vswprintf(szBuffer,
format, args); va_end(args);#ifdef DEBUG wprintf(_T("%S THR:%8.8x %s %s
"),
GetCurrentTime(), GetCurrentThread(), LogLevelStr[enLogLevel], szBuffer);#else
//combine time stamp, thread number and log level together. if( 0 >
fwprintf(m_hLogFile, _T("%S THR:%8.8x %s %s
"), GetCurrentTime(),
GetCurrentThreadId(), LogLevelStr[enLogLevel], szBuffer) ) { Dispose(); } else {
fflush(m_hLogFile); }#endif }
Singleton模式
这个Logger类使用Singleton模式来实现,不知道什么时候开始博客园已经不再流行设计模式了,一方面说明设计模式不再是阳春白雪,已经深入人间。另一方面又兴起了反模式热潮。在反模式的风潮中,Singleton是给人批评最多的模式,Singleton有点像变相的全局变量,破坏了封装,混乱了各个类的依赖关系。
我还是那句话,模式本身没有错,看用的人是否把特定的模式用在特定的场景下。Singleton我还是会用到,如果某个资源类有且只有一份,我就使用Singleton。没有必要产生多个对象,而且多个对象访问独占资源会有同步问题。在Logger类,我还是使用Singleton,因为我只写一个文件。
Singleton的具体实现一般关心三个问题: 1. 有且只有一个对象实例化。 2.多线程的控制。其实第二个问题也是为了保证第一个问题。3. 按需实例化。
private: /* more (non-static) functions here */ Logger(); // ctor hidden Logger(Logger const&); // copy ctor hidden Logger& operator=(Logger
[]
更多精彩
赞助商链接