单件模式
单件模式的形成思路:
我们可以通过程序员之间的约定来实现一个类A只能有一个实例a,但这不如让程序员在不约定的前提下实现一个类A只能有一个实例a;要想实现这一目的,首先类A的构造函数首先要不能访问,因为如果构造函数可以访问你就永远无法阻止程序员创建类A的其他实例,但是我们还想创建一个类A的实例a,这必须使用类A的构造函数,现在的情况是类A的构造函数只能在类A内访问或类A的友元内访问,如果在类A内访问就需要在成员函数中构造类A的实例,但是该成员函数必须能够在类外访问,因为我们有可能在类外在需要的时候创建类A的实例,然而在类外访问该成员函数的前提是有该类的对象,除非该成员函数是静态成员函数。然后我们在类A外创建类A的实例时,需要调用类A的静态成员函数,并且需要判断,如果已经存在类A的实例就不生成,这一点怎么实现呢,需要一个全局都可以访问的变量来记录类A的实例,我们首先想到全局变量,全局变量如果被创建,每次创建类A实例时判断,这样不如将判断直接封装在类A的成员函数当中,这样就可以实现一个类A只能有一个实例a。我们还需要解决一个问题,就是全局变量哪里都可以访问,最好将全局变量替换成静态成员变量,并且设为私有,这样只有类A的成员函数在判断的时候可以使用。其他类不能直接访问。
#ifndef GOBAL_H #define GOBAL_H #include <windows.h> HANDLE hMutex; #endif
#ifndef SINGLETON_H #define SINGLETON_H #include "stdio.h" #include "Gobal.h" class Singleton { private: Singleton(){} public: static Singleton* getInstance() { ////WaitForSingleObject (hMutex, INFINITE); //第一种改善多线程问题的方法,只有第一次创建对象的时候会存在同步问题,其它的创建时线程同步均没有意义。 //if (NULL == uniqueInstance) //{ // uniqueInstance = new Singleton(); //} ////ReleaseMutex (hMutex); //第一种改善多线程问题的方法 //return uniqueInstance; /*************************************************************************/ //第三种改善多线程问题的方法 if (NULL == uniqueInstance) { WaitForSingleObject (hMutex, INFINITE); if (NULL == uniqueInstance) { uniqueInstance = new Singleton(); } ReleaseMutex(hMutex); } return uniqueInstance; /***************************************************************************/ } private: static Singleton* uniqueInstance; }; Singleton* Singleton::uniqueInstance = NULL; #endif /***********************************************************************/ //第二种改善多线程问题的方法 //#ifndef SINGLETON_H //#define SINGLETON_H // //class Singleton //{ //private: // Singleton(){} //public: // static Singleton* getInstance() // { // return uniqueInstance; // } //private: // static Singleton* uniqueInstance; //}; // //Singleton* Singleton::uniqueInstance = new Singleton(); // //#endif /***********************************************************************/
#include "Singleton.h" #include "Gobal.h" #include <windows.h> DWORD WINAPI Fun1Proc (LPVOID lpParameter); DWORD WINAPI Fun2Proc (LPVOID lpParameter); void main() { HANDLE hThread1; HANDLE hThread2; hMutex = CreateMutex (NULL, FALSE, NULL); hThread1 = CreateThread (NULL, 0, Fun1Proc, NULL, 0, NULL); hThread2 = CreateThread (NULL, 0, Fun1Proc, NULL, 0, NULL); CloseHandle(hThread1); CloseHandle(hThread2); Sleep(4000); } DWORD WINAPI Fun1Proc (LPVOID lpParameter) { Singleton* st1 = Singleton::getInstance(); return 0; } DWORD WINAPI Fun2Proc (LPVOID lpParameter) { Singleton* st2 = Singleton::getInstance(); return 0; }

浙公网安备 33010602011771号