码迷,mamicode.com
首页 > 编程语言 > 详细

大话设计模式C++实现-第21章-单例模式

时间:2014-12-10 00:37:07      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:大话设计模式   单例模式      临界区   

一、UML图

bubuko.com,布布扣

二、概念

单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点。[DP]

通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保护它的唯一实例。这个类可以保证没有其他实例可以被创建,并且他可以提供一个访问该实例的方法。

三、注意:

使用单例模式,只能保证一个线程内对象不会被多次创建,而不不能保证多线程的情况。因此,需要考虑多线程的话,就要用锁。

四、UML实现

头文件Singleton.h:

#ifndef SINGLETON_H
#define SINGLETON_H
#include <afx.h>

class Singleton
{
private:
	static Singleton* instance;
	//临界区,防止多线程产生多个实例
	static CRITICAL_SECTION m_Sec;
	Singleton(){}
public:
	static CRITICAL_SECTION* getLock()
	{
		return &m_Sec;
	}
	static Singleton *GetInstance()
	{
		//双重锁定
		if(instance==NULL)
		{
			
			EnterCriticalSection(&m_Sec);
			
			if(instance==NULL)
				instance=new Singleton();

			LeaveCriticalSection(&m_Sec);
			
		}
		return instance;
	}
};

#endif


客户单代码:

#include <iostream>
#include "Singleton.h"

//静态成员在类体外定义
Singleton* Singleton::instance=0;
CRITICAL_SECTION Singleton::m_Sec=CRITICAL_SECTION();

void main()
{
	//初始化临界区
	InitializeCriticalSection(Singleton::getLock());

	Singleton* singleton1=Singleton::GetInstance();
	Singleton* singleton2=Singleton::GetInstance();

	//删除临界区
	DeleteCriticalSection(Singleton::getLock());

	if(singleton1==singleton2)
		std::cout<<"两个对象是相同的实例。"<<std::endl;

	system("pause");
}


大话设计模式C++实现-第21章-单例模式

标签:大话设计模式   单例模式      临界区   

原文地址:http://blog.csdn.net/xiqingnian/article/details/41833033

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!