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

2015-01-25 11:40:46 · 作者: · 浏览: 3

一、UML图

\

二、概念

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

通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保护它的唯一实例。这个类可以保证没有其他实例可以被创建,并且他可以提供一个访问该实例的方法。<??http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PHN0cm9uZz7I/aGi16LS4qO6PC9zdHJvbmc+PC9wPgo8cD7KudPDtaXA/cSjyr2jrNa7xNyxo9ak0ru49s/fs8zE2rbUz/Oyu7vhsbu24LTOtLS9qKOstviyu7K7xNyxo9aktuDP37PMtcTH6b/2oaPS8rTLo6zQ6NKqv7zCx7bgz9+zzLXEu7CjrL7N0qrTw8v4oaM8L3A+CjxwPjxzdHJvbmc+y8SholVNTMq1z9Y8L3N0cm9uZz48L3A+CjxwPs23zsS8/lNpbmdsZXRvbi5oo7o8L3A+CjxwPjxwcmUgY2xhc3M9"brush:java;">#ifndef SINGLETON_H #define SINGLETON_H #include 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 
  
   
#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<<"两个对象是相同的实例。"<