设计模式——单例模式

       设计模式是人们从长期的软件开发实战中总结出来的一些经验之谈,为软件领域中的开发人员提供了一种使用专家设计经验的有效途径,通常是多个设计模式结合使用。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,只有通过大量的编程实践才能真正领悟设计模式的精髓。在参加校招前我翻看了部分设计模式相关的书,对于每个设计模式模式,用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.csdn.net/wuzhekai1985

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值