设计模式是人们从长期的软件开发实战中总结出来的一些经验之谈,为软件领域中的开发人员提供了一种使用专家设计经验的有效途径,通常是多个设计模式结合使用。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,只有通过大量的编程实践才能真正领悟设计模式的精髓。在参加校招前我翻看了部分设计模式相关的书,对于每个设计模式模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模式》和《设计模式》两本书以及借鉴其他博客园博文的优秀部分。本文介绍单例模式的实现。希望对大家加深对设计模式的理解有一点帮助。
单例的一般实现比较简单,下面是线程安全的单例模式代码。由于构造函数是私有的,因此无法通过构造函数实例化,唯一的方法就是通过调用静态函数GetInstance。
下面为大家带来一段线程安全的单例模式的实现代码,程序是通过临界区实现线程间的同步,代码比较简单,仅供大家参考。
/*
单例模式(考虑线程安全)
*/
#include
#include
using namespace std;
//临界区
CRITICAL_SECTION g_csCode;
CRITICAL_SECTION g_csSingle;
class Singleton
{
private:
staticSingleton* m_pInstance;
//构造函数私有化
Singleton()
{
}
public:
//获取实例
staticSingleton* GetInstance()
{
//进入临界区
EnterCriticalSection(&g_csSingle);
if(NULL== m_pInstance)
{
m_pInstance = new Singleton();//实例化对象
LeaveCriticalSection(&g_csSingle);//离开临界区
returnm_pInstance;//返回创建的实例
}
else
{
//如果没有此语句,可能导致测序阻塞
LeaveCriticalSection(&g_csSingle);//离开临界区
returnm_pInstance;
}
}
//释放实例
staticvoid Release()
{
if(NULL!= m_pInstance)
{
deletem_pInstance;
m_pInstance= NULL;
}
}
//屏蔽拷贝构造、赋值运算符
Singleton(constSingleton& other);
Singleton& operator = (const Singleton &other);
};
//静态变量赋值
Singleton* Singleton::m_pInstance = NULL;
//线程回调函数
DWORD WINAPI ThreadProc(
LPVOIDlpParameter // thread data
)
{
//创建实例
Singleton*pObj = Singleton::GetInstance();
//进入临界区
EnterCriticalSection(&g_csCode);
printf("%p\n",pObj);
//退出临界区
LeaveCriticalSection(&g_csCode);
return 0;
}
#if 1
void main()
{
/*测试一
Singleton*pObj = Singleton::GetInstance();
cout<
<
好啦,单例模式就介绍到这里了,希望你已经掌握了这个模式并且可以熟练的使用它,那么本博文的效果就达到了。如果你还觉得意犹未尽,那么可以去看看博主的其他设计模式的介绍哦。
关于设计模式,我推荐大家看看以下博客写的博文,关于设计模式的讲解将的特别好,我从中学习了很多,我的设计模式中的部分博文就是从这里借鉴过来的。
博客链接:http://blog.youkuaiyun.com/wuzhekai1985