单件模式

单件模式的形成思路

我们可以通过程序员之间的约定来实现一个类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
Gobal.h
#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
/***********************************************************************/
Singleton.h
#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;
}
main.cpp

 

posted @ 2015-10-10 12:21  lisiyuannnn  阅读(147)  评论(0)    收藏  举报