大话设计模式C++实现-第21章-单例模式
一、UML图
二、概念
单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点。[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"); }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。