题目二:实现单例模式

Posted yzdai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题目二:实现单例模式相关的知识,希望对你有一定的参考价值。

////////////////////////////////////////////////////////////////////////////////////////////////////////
// 4.单例模式测试

extern CMutex g_stMutex;    // 这个在ThreadTest.cpp中定义了,这个声明一下!!!!

class CSingletonTest

public:
    CSingletonTest() :m_iCount(0)
    ~CSingletonTest()
    void AddCount()  m_iCount++; 
    void SubCount()  m_iCount--; 
    int GetCount()  return m_iCount; 

private:
    int m_iCount;
;

class CSingleton_1

protected:
    // 禁止外部调用这几个函数
    CSingleton_1()
    ~CSingleton_1()
    CSingleton_1(const CSingleton_1&);
    CSingleton_1& operator=(const CSingleton_1&);

;

///////////////////////////////////////////////////////
// 懒汉模式 
//类加载进来,没有对象,只有调用了getInstance方法时,才会创建对象。
//延迟加载形式。 并发过程中存在安全隐患。

template <typename TYPE>
class CSingleton_2 : public CSingleton_1

public:
    static TYPE* GetInstance()
    
        if (NULL == m_pSingleton)
        
            cout << "Try Lock --------------->" << endl;
            m_pSingleton = new CSingleton_2<TYPE>();
        

        return &m_pSingleton->m_stInstance;
    
private:
    static CSingleton_2<TYPE>* m_pSingleton;
    TYPE m_stInstance;

private:
    // 自动释放内存(不需要定义也可以,程序结束是系统会自动回收)
    class CGarbo
    
    public:
        ~CGarbo()
        
            if (m_pSingleton)
            
                delete m_pSingleton;
                m_pSingleton = NULL;
            
        
    ;

    static CGarbo garbo;
;

template <typename TYPE>
CSingleton_2<TYPE>* CSingleton_2<TYPE>::m_pSingleton;

typedef CSingleton_2<CSingletonTest> SingletonTesHEAP_TYPE;

////////////////////////////////////////////////////////////
// 加锁的懒汉实现
template <typename TYPE>
class CSingleton_3 : public CSingleton_1

public:
    static TYPE* GetInstance()
    
        if (NULL == m_pSingleton)
        
            cout << "Try Lock --------------->" << endl;
            CLock lock(g_stMutex);
            if (NULL == m_pSingleton)
            
                m_pSingleton = new CSingleton_3<TYPE>();
            
        
        return &m_pSingleton->m_stInstance;
    
private:
    static CSingleton_3<TYPE>* m_pSingleton;
    TYPE m_stInstance;
;

template <typename TYPE>
CSingleton_3<TYPE>* CSingleton_3<TYPE>::m_pSingleton;

typedef CSingleton_3<CSingletonTest> SingletonTest3;


////////////////////////////////////////////////////////////////
// 饿汉模式
template <typename TYPE>
class CSingleton_4 : public CSingleton_1

public:
    static TYPE* GetInstance()
    
        //return &(const_cast<CSingleton2<TYPE>*>(m_pSingleton)->m_stInstance);
        return &(const_cast<CSingleton_4<TYPE>*>(m_pSingleton)->m_stInstance);
    
private:
    const static CSingleton_4<TYPE>* m_pSingleton;
    TYPE m_stInstance;
;

template <typename TYPE>
const CSingleton_4<TYPE>* CSingleton_4<TYPE>::m_pSingleton = new CSingleton_4<TYPE>;
typedef CSingleton_4<CSingletonTest> SingletonTest4;


////////////////////////////////////////////////////////////////////////
// 多线程测试函数
template <typename TYPE>
class CSingletonThreadTest : public CThread

public:
    CSingletonThreadTest(const string& str) :m_szThreadName(str) 
    ~CSingletonThreadTest()

    virtual void Run()
    
        for (int i = 0; i < 5000; i++)
        
            //CLock Lock(g_stMutex);
            TYPE::GetInstance()->AddCount();
            //cout << m_szThreadName << ": " << TYPE::GetInstance()->GetCount() << endl;
        
    

private:
    string m_szThreadName;
;

void CSingleton_2TestFunc()

    cout << "\n\n --------------- CSingleton_2TestFunc Start -------------->" << endl;
    double dStart = clock();

    // 1.单线程测试
    CSingletonTest* pTest = SingletonTesHEAP_TYPE::GetInstance();
    pTest->AddCount();
    cout << "pTest Count = " << pTest->GetCount() << endl;

    // pTest 和 pTesHEAP_TYPE指向同一个对象
    CSingletonTest* pTesHEAP_TYPE = SingletonTesHEAP_TYPE::GetInstance();
    pTesHEAP_TYPE->AddCount();
    cout << "pTesHEAP_TYPE Count = " << pTesHEAP_TYPE->GetCount() << endl;

    // 2.多线程下测试 测试5000数据,加锁情况下5000, 不加锁不一定为5000
    CSingletonThreadTest<SingletonTesHEAP_TYPE> Test1("Test1");
    Test1.Start();
    CSingletonThreadTest<SingletonTesHEAP_TYPE> TesHEAP_TYPE("TesHEAP_TYPE");
    TesHEAP_TYPE.Start();
    CSingletonThreadTest<SingletonTesHEAP_TYPE> Test3("Test3");
    Test3.Start();
    CSingletonThreadTest<SingletonTesHEAP_TYPE> Test4("Test4");
    Test4.Start();
    CSingletonThreadTest<SingletonTesHEAP_TYPE> Test5("Test5");
    Test5.Start();

    CT_SLEEP(1);

    cout << "CSingleton_2TestFunc : " << SingletonTesHEAP_TYPE::GetInstance()->GetCount() << endl;
    cout << "花费时间: " << (clock() - dStart) / CONST_1000 << endl;

    cout << "\n\n --------------- CSingleton_2TestFunc End -------------->" << endl;



template <typename TYPE>
void SingletonTestFunc()

    //double dStart = clock();
    // 1.单线程测试
    TYPE::GetInstance()->AddCount();
    TYPE::GetInstance()->AddCount();
    cout << typeid(TYPE::GetInstance()).name() << ": Count = " << TYPE::GetInstance()->GetCount() << endl;

    CSingletonThreadTest<TYPE> Test1("Test1");
    Test1.Start();
    CSingletonThreadTest<TYPE> TesHEAP_TYPE("TesHEAP_TYPE");
    TesHEAP_TYPE.Start();
    CSingletonThreadTest<TYPE> Test3("Test3");
    Test3.Start();
    CSingletonThreadTest<TYPE> Test4("Test4");
    Test4.Start();
    CSingletonThreadTest<TYPE> Test5("Test5");
    Test5.Start();

    CT_SLEEP(10);

    cout << "SingletonTestFunc : " << TYPE::GetInstance()->GetCount() << endl;
    //cout << "花费时间: " << (clock() - dStart) / CONST_1000 << endl;


void SingletonPatternTestFunc()

    cout << "\n\n --------------- SingletonPatternTestFunc Start -------------->" << endl;
    
    //CSingleton_2TestFunc();

    SingletonTestFunc<SingletonTesHEAP_TYPE>();

    cout << "===================================================>>>" << endl;

    SingletonTestFunc<SingletonTest3>();

    cout << "===================================================>>>" << endl;
    SingletonTestFunc<SingletonTest4>();


    cout << "\n\n --------------- SingletonPatternTestFunc End -------------->" << endl;

以上是关于题目二:实现单例模式的主要内容,如果未能解决你的问题,请参考以下文章

Java模式设计之单例模式(二)

设计模式之单例模式

097 单例模式

设计模式——单例模式

单例模式

设计模式——单例模式