設計模式之單例模式

一、作用
保證一個類中只生成唯一的實例對象。換句話說,在整個程序空間中,該類只有一個實例對象
1、該類不能被複制
2、該類不能被公開的創造

那麼對於C++來說,他的構造函數,拷貝構造函數和他的賦值函數都不能被公開調用。
但對於該私有的構造函數的構造時機上來說也可以分兩種情況來構造:

1.  只有當需要改類的時候去構造(即爲懶漢模式)
2.  在程序開始之前我就先構造好,你到時候直接用就可(即爲餓漢模式)

二、爲什麼需要單例模式?
(1)在多個線程之間,如初始化一次socket資源
(2)在整個程序空間使用全局變量,共享資源。
(3)大規模系統中,爲了性能的考慮,需要節省對象的創建時間。

三、實現膽力的常用步驟
(1)構造函數私有化
(2)提供一個全局的靜態方法(全局訪問點)
(3)在類中定義一個靜態指針,指向本類的變量的靜態變量指針

四、單例模式的分類及實現
(1)懶漢式

#include <iostream>
using namespace std;
class Singelton
{
private:
    Singelton()
    {
        cout << "Singelton 構造函數執行" << endl;
    }
    Singelton & operator=(const Singelton &);
public:
    static Singelton *getInstance()
    {
        if (m_psl == NULL)
        {
            m_psl = new Singelton;
        }
        return m_psl;
    }

    static void FreeInstance()
    {
        if (m_psl != NULL)
        {
            delete m_psl;
            m_psl = NULL;
        }
    }

private:
    static Singelton *m_psl;
};

Singelton *Singelton::m_psl = NULL;


void main041()
{

    Singelton *p1 = Singelton::getInstance();
    Singelton *p2 = Singelton::getInstance();

    if (p1 == p2)
    {
        cout << "是同一個對象" << endl;
    }
    else
    {
        cout << "不是同一個對象" << endl;
    }
    Singelton::FreeInstance();


    return ;
}

void main()
{
    main041();

    system("pause");
}

(2)餓漢式

#include <iostream>
using namespace std;
class Singelton
{
private:
    Singelton()
    {
        cout << "Singelton 構造函數執行" << endl;
    }
    Singelton & operator=(const Singelton &);
public:
    static Singelton *getInstance()
    {
        return m_psl;
    }

    static void FreeInstance()
    {
        if (m_psl != NULL)
        {
            delete m_psl;
            m_psl = NULL;
        }
    }

private:
    static Singelton *m_psl;
};

//int g_count = 0;
//餓漢式
Singelton *Singelton::m_psl = new Singelton;


void main041()
{
    printf("sss\n");
    Singelton *p1 = Singelton::getInstance();
    Singelton *p2 = Singelton::getInstance();

    if (p1 == p2)
    {
        cout << "是同一個對象" << endl;
    }
    else
    {
        cout << "不是同一個對象" << endl;
    }
    Singelton::FreeInstance();

    return ;
}

void main()
{
    main041();

    system("pause");
}

五、懶漢式和餓漢式的線程安全

多線程中會導致多個實例的產生,從而導致運行代碼不正確以及內存的泄露。
單例模式保證了多線程的安全性。

發佈了106 篇原創文章 · 獲贊 18 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章